将两个正则表达式完全按照您的方式组合起来会很好。换句话说,只需使用交替/管道运算符来组合
/^[0-9]{10}$/
and
/^[-]$/
照原样,直接进入
/^[0-9]{10}$|^[-]$/
↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑ YOUR ORIGINAL REGEXPS, COMBINED AS IS WITH |
这可以表示为
那效果会很好。正如其他人指出的那样,您不需要在字符类中指定连字符,因此
/^[0-9]{10}$|^-$/
↑ SIMPLIFY [-] TO JUST -
现在,我们注意到这两种选择都有一个^
在开始时和$
在最后。这有点重复,而且也使得立即看出正则表达式始终从头到尾匹配事物变得更加困难。因此,我们可以重写它,正如其他答案中所解释的那样,通过采用^
and $
出两个子正则表达式,并使用分组运算符组合它们的内容()
:
/^([0-9]{10}|-)$/
↑↑↑↑↑↑↑↑↑↑↑↑↑ GROUP REGEXP CONTENTS WITH PARENS, WITH ANCHORS OUTSIDE
对应的可视化是
这也可以正常工作,但你可以使用\d
代替[0-9]
, 所以最终的、最简单的版本 is:
/^(\d{10}|-)$/
↑↑ USE \d FOR DIGITS
这可视化为
如果由于某种原因您不想“捕获”该组,请使用(?:
, as in
/^(?:\d{10}|-)$/
↑↑ DON'T CAPTURE THE GROUP
现在,可视化显示该组未被捕获:
顺便说一句,在您最初尝试组合两个正则表达式时,我注意到您将它们括起来,如下所示
/^([0-9]{10})|([-])$/
↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑ YOU PARENTHESIZED THE SUB-REGEXPS
但实际上这是不必要的,因为管道(“或”的替代)运算符已经具有较低的优先级(实际上它具有所有正则表达式运算符的最低优先级); “低优先级”意味着它仅适用after两边的东西都已经处理过了,所以你在这里写的和
/^[0-9]{10}|[-]$/
然而,由于其他答案中提到的原因,它仍然不起作用,从其可视化中可以清楚地看出: