【发布时间】:2018-07-23 00:55:35
【问题描述】:
我正在开发一个信用卡验证 Java 程序,但我一直在思考如何正确格式化正则表达式来检查 CC 编号是否以 4 开头。 这就是我所拥有的:
if (cardNum.matches("^4\\d"))
【问题讨论】:
我正在开发一个信用卡验证 Java 程序,但我一直在思考如何正确格式化正则表达式来检查 CC 编号是否以 4 开头。 这就是我所拥有的:
if (cardNum.matches("^4\\d"))
【问题讨论】:
String#matches 函数将您指定的模式应用于整个 字符串输入。因此,您可能会想到以下内容:
if (cardNum.matches("^4\\d+")) {
// then CC starts with 4, followed by more numbers
}
但是请注意,创建正则表达式来验证各种类型的信用卡号码的问题是一个老问题,并且已经解决了。查看here 了解更多信息。
【讨论】:
现在,您的正则表达式只会匹配字符串“4\d”。如果您希望它表示“4,然后是 0 位或更多小数”,则应使用 Kleene 星号运算符“*”,如 4\d*
【讨论】:
String#matches 会检查整个输入,而不仅仅是其中的一部分。
因为您匹配的是整个信用卡号并且您使用的是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用作:
"^4\\d{3}-\\d{4}-\\d{4}-\\d{3}" 匹配 4485-7622-4840-4312;^4\\d{3}\s*\\d{4}\\s*\\d{4}\\s*\\d{4} 匹配 4485762248404312 和 4485 7622 4840 4312;【讨论】: