仅限数字和连字符的正则表达式

时间:2016-07-31 05:11:40

标签: javascript regex

我正在尝试理解正则表达式,对于长度为10的数字我可以简单地执行

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

仅限连字符我可以做

/^[-]$/

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

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

此表达式无法正常工作,如果字符串无效,它将以某种方式匹配部分字符串而不是匹配。

enter image description here

如何制作仅接受"的正则表达式? - "或10位数?

4 个答案:

答案 0 :(得分:4)

将两个正则表达式完全结合起来就可以了。换句话说,只需使用交替/管道运算符来组合

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

/^[-]$/

直接进入

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

这可以表示为

Regular expression visualization

这本来可以。正如其他人所指出的那样,您不需要在字符类中指定连字符,所以

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

现在,我们注意到两个选项中的每一个在开头都有^,在结尾有$。这有点重复,它也使得立即看到regexp总是从头到尾匹配的东西变得更加困难。因此,我们可以通过从两个子正则表达式中取^$并使用分组运算符()组合其内容来重写此内容,如其他答案中所述:

/^([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 :(得分: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 :(得分:2)

要获取仅接受“ - ”或10位的正则表达式 - 更改正则表达式,如下所示:

^(\d{10}|-)$

DEMO link

答案 3 :(得分:1)

正则表达式的问题在于它正在寻找字符串

  1. 从10位开始,即^([0-9]{10})

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

  3. 您需要一个附加包装^( .. )$来完成这项工作。即。

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

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