我有以下正则表达式:
/^[0-9]{8}([a-z]{1})?|[0-9]{3}-[0-9]{2}-[0-9]{3}([a-z]{1})?/
我试图匹配以下模式12345678,12345678a(任意1个字符),123-45-678,123-45-678a(任意1个字符)。
问题是如果我输入123456789,由于第一个条件[0-9] {8},它仍然有效。我搜索了我是否可以使用某种AND运算符,但没有找到任何东西。有没有为什么要为每个条件添加到我的正则表达式以匹配长度。示例[0-9] {8}也必须匹配确切的长度?所以12345678是正确的但是123456789失败了吗?
更新1
你们给了我很好的例子。这绝对让我的表达更小。我仍然面临的唯一问题是以下JavaScript代码:
var regExp = new RegExp(/^\d{3}-?\d{2}-?\d{3}[a-z]?/g);
var isValid = regExp.test('12345678');
isValid is true
var isValid = regExp.test('12345678d');
is valid
the problem is if I enter
var isValid = regExp.test('12345678dd');
is also valid because of 12345678d
Since test() is used to find a match. Is there a way to test the exact phrase of the regular expression so that 12345678dd fails?
更新2 好吧,我完全错过了Everyone示例中的结尾$。我非常感谢你的帮助
答案 0 :(得分:2)
修复正则表达式的一种方法是:
/^\d{3}(-?)\d{2}\1\d{3}[a-z]?$/
<强>解释强>
^
=字符串的开头
\d
=从0到9的任意1位数字,与[0-9]
相同
{3}
=前一次事件正好出现3次,在这种情况下为\d
-?
=可选-
(<part-of-regex-here>)
=捕获从1开始编号的匹配,可以在正则表达式中引用为\1
[a-z]
=任何小写字母
$
=字符串结尾
响应更新1:
如果你试试我的正则表达式:
var regExp = new RegExp(/^\d{3}-?\d{2}-?\d{3}[a-z]?$/);
var isValid = regExp.test('12345678');
console.log(isValid);
isValid = regExp.test('12345678d');
console.log(isValid);
isValid = regExp.test('12345678dd');
console.log(isValid);
&#13;
答案 1 :(得分:1)
你可以使用/^(?:\d{8}|\d{3}-\d{2}-\d{3})[a-z]?$/
,注意字符串的开头(^)和结尾($)的锚点。
我还使用了\d
代替[0-9]
因为它更短且更具可读性,并将[a-z]?
置于交替之外。无需使用{1}
。
这是Regex101
的演示