我想了解正则表达式,对于长度为10的数字,我可以简单地做
/^[0-9]{10}$/
Run Code Online (Sandbox Code Playgroud)
只可以连字符
/^[-]$/
Run Code Online (Sandbox Code Playgroud)
使用组表达式将两者结合起来将导致
/^([0-9]{10})|([-])$/
Run Code Online (Sandbox Code Playgroud)
此表达式无法按预期工作,如果字符串无效,它将以某种方式匹配字符串的一部分,而不是完全不匹配。
如何制作仅接受“-”或10位数字的正则表达式?
小智 5
将两个正则表达式完全按照您的需要组合在一起会很好用。换句话说,只需使用交替/管道运算符来组合
/^[0-9]{10}$/
Run Code Online (Sandbox Code Playgroud)
和
/^[-]$/
Run Code Online (Sandbox Code Playgroud)
就这样,直接进入
/^[0-9]{10}$|^[-]$/
??????????? ????? YOUR ORIGINAL REGEXPS, COMBINED AS IS WITH |
Run Code Online (Sandbox Code Playgroud)
这可以表示为

这样就可以了。正如其他人指出的那样,您无需在字符类中指定连字符,因此
/^[0-9]{10}$|^-$/
? SIMPLIFY [-] TO JUST -
Run Code Online (Sandbox Code Playgroud)
现在,我们注意到两个选择中的每一个^在开头都有a ,$在结尾都有a 。这有点重复,并且也使得立即看到正则表达式始终从头到尾匹配所有内容变得更加困难。因此,如其他答案所述,我们可以通过将两个子正则表达式中的^和$删除,来重写它,并使用分组运算符将它们的内容组合起来():
/^([0-9]{10}|-)$/
????????????? GROUP REGEXP CONTENTS WITH PARENS, WITH ANCHORS OUTSIDE
Run Code Online (Sandbox Code Playgroud)
相应的可视化为

这样做也可以,但是您可以使用\d代替[0-9],因此最终的最简单的版本是:
/^(\d{10}|-)$/
?? USE \d FOR DIGITS
Run Code Online (Sandbox Code Playgroud)
这可视化为

如果由于某种原因您不想“捕获”该组,请使用(?:,如
/^(?:\d{10}|-)$/
?? DON'T CAPTURE THE GROUP
Run Code Online (Sandbox Code Playgroud)
现在,可视化显示未捕获组:

顺便说一句,在您最初尝试将两个正则表达式结合在一起时,我注意到您将它们括起来,如下所示:
/^([0-9]{10})|([-])$/
??????????? ????? YOU PARENTHESIZED THE SUB-REGEXPS
Run Code Online (Sandbox Code Playgroud)
但这实际上不是必需的,因为管道运算符(或“或”的替代字符)的优先级已经很低(实际上,它是所有regexp运算符的最低优先级)。“低优先级”表示仅在双方的事情都已处理后才适用,因此您在此处编写的内容与
/^[0-9]{10}|[-]$/
Run Code Online (Sandbox Code Playgroud)
但是,由于其他答案中提到的原因,它仍然不起作用,从其可视化效果可以明显看出:
