【发布时间】:2017-06-22 06:58:37
【问题描述】:
因此程序会检查输入的号码是否是有效的美国电话号码。
它广泛使用正则表达式。
一般来说,它可以正常工作。
但对于某些输入,它返回无效的布尔值。为什么会这样?
输入:
- “1 (555) 555-5555”应该返回true,但实际上返回false。
- “(555)555-5555”应该返回true,但实际上返回false。
- “1(555)555-5555”应该返回true,但实际上返回false。
- “(6505552368)”应该返回false,但实际上返回true。
- “27576227382”应该返回false,但实际上返回true。
- "(555-555-5555" 应该返回false,但实际上返回true。
以下是有效的美国电话号码格式列表:
- 555-555-5555
- (555)555-5555
- (555) 555-5555
- 555 555 5555
- 5555555555
- 1 555 555 5555
function telephoneCheck(str) {
// Good luck!
var regexArr = ["[0-9]{3}-[0-9]{3}-[0-9]{4}",
"([0-9]{3})[0-9]{3}-[0-9]{4}",
"1{1}([0-9]{3})[0-9]{3}-[0-9]{4}",
"[0-9]{3} [0-9]{3} [0-9]{4}",
"[1]{1} [0-9]{3} [0-9]{3} [0-9]{4}",
"1 ([0-9]{3}) [0-9]{3}-[0-9]{4}",
"[0-9]{10}"];
var cond = false;
for(var i = 0;i < regexArr.length;i++){
var regexObj = new RegExp(regexArr[i], "");
if(regexObj.test(str)){cond = true;
break;}
}
return cond;
}
telephoneCheck("555-555-5555");
【问题讨论】:
-
除其他外,括号是正则表达式语法中的元字符。
(或)字符与括号字符不匹配。相反,它们充当分组运算符。 -
"27576227382" 包含 11 位数字,即 10 + 1 位数字。 “10 位”正则表达式匹配它。如果您不希望它匹配,请使用锚点:
"^[0-9]{10}$" -
@Watilin 这适用于特定的输入,谢谢。
-
这应该被简化为minimal reproducible example,你只有一个正则表达式与一个字符串进行比较,这实际上可能是一个有用的问题,即如何匹配正则表达式中的括号(尽管这可能是重复的东西)。就目前而言,这个问题对其他人没有多大价值(如果有的话)。
-
回滚了,因为在编辑后问题变得不那么有用了。如果您有更多要问的问题,请发布一个新问题。
标签: javascript regex algorithm