我正在尝试理解正则表达式,对于长度为10的数字我可以简单地执行
/^[0-9]{10}$/
仅限连字符我可以做
/^[-]$/
将两个使用组表达式组合将导致
/^([0-9]{10})|([-])$/
此表达式无法正常工作,如果字符串无效,它将以某种方式匹配部分字符串而不是匹配。
如何制作仅接受"的正则表达式? - "或10位数?
答案 0 :(得分:4)
将两个正则表达式完全结合起来就可以了。换句话说,只需使用交替/管道运算符来组合
/^[0-9]{10}$/
和
/^[-]$/
直接进入
/^[0-9]{10}$|^[-]$/
↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑ YOUR ORIGINAL REGEXPS, COMBINED AS IS WITH |
这可以表示为
这本来可以。正如其他人所指出的那样,您不需要在字符类中指定连字符,所以
/^[0-9]{10}$|^-$/
↑ SIMPLIFY [-] TO JUST -
现在,我们注意到两个选项中的每一个在开头都有^
,在结尾有$
。这有点重复,它也使得立即看到regexp总是从头到尾匹配的东西变得更加困难。因此,我们可以通过从两个子正则表达式中取^
和$
并使用分组运算符()
组合其内容来重写此内容,如其他答案中所述:
/^([0-9]{10}|-)$/
↑↑↑↑↑↑↑↑↑↑↑↑↑ GROUP REGEXP CONTENTS WITH PARENS, WITH ANCHORS OUTSIDE
相应的可视化是
这也可行,但您可以使用\d
代替[0-9]
,因此最终,最简单的版本是:
/^(\d{10}|-)$/
↑↑ USE \d FOR DIGITS
这可视化为
如果由于某种原因您不想“捕获”该群组,请使用(?:
,如
/^(?:\d{10}|-)$/
↑↑ DON'T CAPTURE THE GROUP
,可视化现在显示未捕获组:
顺便说一下,在您最初组合两个正则表达式的尝试中,我注意到您将它们括起来,如
/^([0-9]{10})|([-])$/
↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑ YOU PARENTHESIZED THE SUB-REGEXPS
但实际上这不是必需的,因为管道(“或”)运算符的替换已经具有低优先级(实际上它具有任何正则表达式运算符的最低优先级); “低优先级”意味着它只适用 两边的东西已经处理完毕,所以你在这里写的内容与
相同/^[0-9]{10}|[-]$/
然而,从其他答案中提到的原因仍然不能起作用,从其可视化中可以清楚地看出:
答案 1 :(得分:3)
如何使正则表达式只接受“ - ”或10位?
您可以使用:
/^([0-9]{10}|-)$/
你的正则表达式只是因为括号错位而断言连字符的存在。
以下是OP正则表达式的有效细分:
^([0-9]{10}) # matches 10 digits at start
| # OR
([-])$ # matches hyphen at end
这将导致OP的正则表达式匹配任何以10位开头或以连字符结尾的输入,使得这些无效输入也是有效匹配:
1234567890111
1234----
------------------
1234567890--------
答案 2 :(得分:2)
答案 3 :(得分:1)
正则表达式的问题在于它正在寻找字符串
从10位开始,即^([0-9]{10})
或
以“ - ”结尾 - 即([-])$
您需要一个附加包装^( .. )$
来完成这项工作。即。
/^(([0-9]{10})|([-]))$/
最好/^([0-9]{10}|-)$/
因为[-]
和-
都是相同的。