【问题标题】:Regex expression to match the first digit of a string with 4.正则表达式将字符串的第一个数字与 4 匹配。
【发布时间】:2018-07-23 00:55:35
【问题描述】:

我正在开发一个信用卡验证 Java 程序,但我一直在思考如何正确格式化正则表达式来检查 CC 编号是否以 4 开头。 这就是我所拥有的:

if (cardNum.matches("^4\\d"))

【问题讨论】:

    标签: java regex


    【解决方案1】:

    String#matches 函数将您指定的模式应用于整个 字符串输入。因此,您可能会想到以下内容:

    if (cardNum.matches("^4\\d+")) {
        // then CC starts with 4, followed by more numbers
    }
    

    但是请注意,创建正则表达式来验证各种类型的信用卡号码的问题是一个老问题,并且已经解决了。查看here 了解更多信息。

    【讨论】:

      【解决方案2】:

      现在,您的正则表达式只会匹配字符串“4\d”。如果您希望它表示“4,然后是 0 位或更多小数”,则应使用 Kleene 星号运算符“*”,如 4\d*

      【讨论】:

      • 这是对的,但确切的原因是String#matches 会检查整个输入,而不仅仅是其中的一部分。
      • 对,这是我们想要的行为。
      【解决方案3】:

      因为您匹配的是整个信用卡号并且您使用的是s.matches()

      如您所见,matches 实际上正在检查调用该方法的 整个 字符串:

      判断这个字符串是否匹配给定的正则表达式。

      它还提到:

      调用这种形式为 str.matches(regex) 的方法会产生与表达式完全相同的结果:Pattern.matches(regex, str)

      所以Pattern 提供了有关regex 工作原理的详细信息。

      \d => 一个数字:[0-9]

      ^ => 一行的开头

      X+ => X,一次或多次

      在您的情况下,您需要确保 regex 模式 匹配 整个 信用卡号码。

      if (cardNum.matches("^4\\d+"));
      

      如果需要指定长度范围来消除无效数字:

      X{n,m} => X,至少 n 次但不超过 m 次

      您需要将其指定为:

      if (cardNum.matches("^4\\d{16,19}"));
      

      如果您要检查大量数字,最好转向Pattern,而不是避免senseless pattern compiling overhead

      private final static Pattern CREDIT_CARD_PATTERN = Pattern.compile("^4\\d+");
      if (CREDIT_CARD_PATTERN.matcher(s).matches());  
      

      当它包含连字符空格时,您可以将regex用作:

      1. "^4\\d{3}-\\d{4}-\\d{4}-\\d{3}" 匹配 4485-7622-4840-4312;
      2. ^4\\d{3}\s*\\d{4}\\s*\\d{4}\\s*\\d{4} 匹配 44857622484043124485 7622 4840 4312;

      【讨论】:

        猜你喜欢
        • 2014-12-14
        • 1970-01-01
        • 1970-01-01
        • 2016-11-18
        • 1970-01-01
        • 2012-09-17
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        相关资源
        最近更新 更多