我想了解正则表达式,为长度为10位,我可以简单地做正则表达式的数字和连字符只有
/^[0-9]{10}$/
的连字符只有我可以做
/^[-]$/
结合使用两个组表达将导致
/^([0-9]{10})|([-])$/
这种表达不工作打算,它在某种程度上将匹配字符串的一部分如果字符串无效,则完全不匹配。
我如何只接受正则表达式表达“ - ”或10个数字?
我想了解正则表达式,为长度为10位,我可以简单地做正则表达式的数字和连字符只有
/^[0-9]{10}$/
的连字符只有我可以做
/^[-]$/
结合使用两个组表达将导致
/^([0-9]{10})|([-])$/
这种表达不工作打算,它在某种程度上将匹配字符串的一部分如果字符串无效,则完全不匹配。
我如何只接受正则表达式表达“ - ”或10个数字?
它会很好地结合你的两个正则表达式,就像你有他们一样。换句话说,只是使用交替/管道操作者
/^[0-9]{10}$/
和
/^[-]$/
原样结合,直接进入
/^[0-9]{10}$|^[-]$/
↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑ YOUR ORIGINAL REGEXPS, COMBINED AS IS WITH |
这可以被表示为
,这将工作得很好。正如其他人所指出的那样,你不需要指定一个字符类的连字符,所以
/^[0-9]{10}$|^-$/
↑ SIMPLIFY [-] TO JUST -
现在,我们注意到,每两个备选方案有^
开头和$
末。这有点重复,它也使得立即看到正则表达式总是从头到尾匹配事物变得很难。因此,我们可以改写这一点,在其他的答案解释,通过采取^
和$
出两个子正则表达式,并使用分组运算符()
结合自己的内容:
/^([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}|[-]$/
,然而,仍然不会在其他提到的原因工作答案,如从它的可视化明确:
我真的很感谢这么详细的解释!感谢您花时间绘制图表。这有助于我更好地理解Regex!谢谢! – Zanko
如何制作只接受“ - ”或10位数的正则表达式?
您可以使用:
/^([0-9]{10}|-)$/
你的正则表达式只是断言到底连字符的存在由于括号的错位。
这里是OP的正则表达式的有效击穿:
^([0-9]{10}) # matches 10 digits at start
| # OR
([-])$ # matches hyphen at end
这将导致OP的正则表达式匹配任何输入开始用10位数字或连字符使这些无效输入也是一个有效的匹配结束:
1234567890111
1234----
------------------
1234567890--------
与您正则表达式的问题是它的寻找字符串或者
开始用10个数字,即^([0-9]{10})
或
结尾 “ - ” - 即([-])$
你需要一个附加包装^(..)$
来获得这项工作。即
/^(([0-9]{10})|([-]))$/
更好的是/^([0-9]{10}|-)$/
因为[-]
和-
都是相同的。
'一个| B'是替代:匹配任一'A'或'B'。在这里,你的'a'模式是'^([0-9] {10}),你的''b'模式是'([ - ])$'。添加括号限制了不包含'^'和'$'的选项。 – Ryan
如果你看过regxp101屏幕右侧的“解释”,它会提供一些很好的线索。 – 2016-07-31 05:46:53