2016-07-31 117 views
3

我想了解正则表达式,为长度为10位,我可以简单地做正则表达式的数字和连字符只有

/^[0-9]{10}$/ 

的连字符只有我可以做

/^[-]$/ 

结合使用两个组表达将导致

/^([0-9]{10})|([-])$/ 

这种表达不工作打算,它在某种程度上将匹配字符串的一部分如果字符串无效,则完全不匹配。

enter image description here

我如何只接受正则表达式表达“ - ”或10个数字?

+2

'一个| B'是替代:匹配任一'A'或'B'。在这里,你的'a'模式是'^([0-9] {10}),你的''b'模式是'([ - ])$'。添加括号限制了不包含'^'和'$'的选项。 – Ryan

+0

如果你看过regxp101屏幕右侧的“解释”,它会提供一些很好的线索。 – 2016-07-31 05:46:53

回答

4

它会很好地结合你的两个正则表达式,就像你有他们一样。换句话说,只是使用交替/管道操作者

/^[0-9]{10}$/ 

/^[-]$/ 

原样结合,直接进入

/^[0-9]{10}$|^[-]$/ 
↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑  YOUR ORIGINAL REGEXPS, COMBINED AS IS WITH | 

这可以被表示为

Regular expression visualization

,这将工作得很好。正如其他人所指出的那样,你不需要指定一个字符类的连字符,所以

/^[0-9]{10}$|^-$/ 
       ↑  SIMPLIFY [-] TO JUST - 

现在,我们注意到,每两个备选方案有^开头和$末。这有点重复,它也使得立即看到正则表达式总是从头到尾匹配事物变得很难。因此,我们可以改写这一点,在其他的答案解释,通过采取^$出两个子正则表达式,并使用分组运算符()结合自己的内容:

/^([0-9]{10}|-)$/ 
    ↑↑↑↑↑↑↑↑↑↑↑↑↑  GROUP REGEXP CONTENTS WITH PARENS, WITH ANCHORS OUTSIDE 

相应的可视化是

Regular expression visualization

这也将正常工作,但你可以使用\d代替[0-9],所以最后,简单版本是:

/^(\d{10}|-)$/ 
    ↑↑     USE \d FOR DIGITS 

,这作为可视化

Regular expression visualization

如果由于某种原因,你不想 “捕获” 的组,使用(?:,如

/^(?:\d{10}|-)$/ 
    ↑↑     DON'T CAPTURE THE GROUP 

和可视化现在显示该组未被捕获:

Regular expression visualization

顺便说一句,在你原来的企图两个正则表达式结合起来,我注意到,你括号它们作为

/^([0-9]{10})|([-])$/ 
    ↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑ YOU PARENTHESIZED THE SUB-REGEXPS 

但其实这是没有必要的,因为管道(交替的“或“)运算符已经具有低优先级(实际上它具有任何正则表达式运算符的最低优先级); “低优先级”意味着它将适用于两方只事情已经处理过的,所以你写到这里是相同的

/^[0-9]{10}|[-]$/ 

,然而,仍然不会在其他提到的原因工作答案,如从它的可视化明确:

Regular expression visualization

+1

我真的很感谢这么详细的解释!感谢您花时间绘制图表。这有助于我更好地理解Regex!谢谢! – Zanko

3

如何制作只接受“ - ”或10位数的正则表达式?

您可以使用:

/^([0-9]{10}|-)$/ 

RegEx Demo

你的正则表达式只是断言到底连字符的存在由于括号的错位。

这里是OP的正则表达式的有效击穿

^([0-9]{10}) # matches 10 digits at start 
|    # OR 
([-])$   # matches hyphen at end 

这将导致OP的正则表达式匹配任何输入开始用10位数字或连字符使这些无效输入也是一个有效的匹配结束:

1234567890111 
1234---- 
------------------ 
1234567890-------- 
+2

我认为OP想要一个 - 。不确定......目前尚不清楚......但基于'/^[ - ] $ /'我相信这是他想要的。 – pah

+1

是的,我认为你是对的。我现在编辑它。 – anubhava

+1

谢谢你,这是完美的!虽然我不确定使这个例子有效的区别是什么!正则表达式令人困惑.. – Zanko

2

要获得只接受正则表达式“ - ”或10个数字 - 改变你的正则表达式如下所示:

^(\d{10}|-)$ 

DEMO link

+0

谢谢你这个作品。我仍然为括号的目的而混淆。 – Zanko

1

与您正则表达式的问题是它的寻找字符串或者

  1. 开始用10个数字,即^([0-9]{10})

  2. 结尾 “ - ” - 即([-])$

你需要一个附加包装^(..)$来获得这项工作。即

/^(([0-9]{10})|([-]))$/ 

更好的是/^([0-9]{10}|-)$/因为[-]-都是相同的。

相关问题