Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅适用于数字和连字符的正则表达式_Javascript_Regex - Fatal编程技术网

Javascript 仅适用于数字和连字符的正则表达式

Javascript 仅适用于数字和连字符的正则表达式,javascript,regex,Javascript,Regex,我试图理解正则表达式,对于长度为10的数字,我可以简单地做到 /^[0-9]{10}$/ 对于连字符,只有我能做 /^[-]$/ 使用组表达式组合这两个表达式将导致 /^([0-9]{10})|([-])$/ 如果字符串无效,该表达式将以某种方式匹配字符串的一部分,而不是完全不匹配 如何使正则表达式只接受“-”或10位数字 如何使正则表达式只接受“-”或10位数字 您可以使用: /^([0-9]{10}|-)$/ 由于括号的错误放置,您的正则表达式只是在最后断言连字符的存在 以下是O

我试图理解正则表达式,对于长度为10的数字,我可以简单地做到

/^[0-9]{10}$/
对于连字符,只有我能做

/^[-]$/
使用组表达式组合这两个表达式将导致

/^([0-9]{10})|([-])$/
如果字符串无效,该表达式将以某种方式匹配字符串的一部分,而不是完全不匹配

如何使正则表达式只接受“-”或10位数字

如何使正则表达式只接受“-”或10位数字

您可以使用:

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

由于括号的错误放置,您的正则表达式只是在最后断言连字符的存在

以下是OP正则表达式的有效细分:

^([0-9]{10})   # matches 10 digits at start
|              # OR
([-])$         # matches hyphen at end
这将导致OP的正则表达式匹配任何以10位数字开头或以连字符结尾的输入,使这些无效输入也成为有效匹配:

1234567890111
1234----
------------------
1234567890--------
要获取只接受“-”或10位数字的正则表达式,请更改您的正则表达式,如下所示:

^(\d{10}|-)$

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

  • 以10位数字开始,即
    ^([0-9]{10})

  • 以“-”结尾,即
    ([-])$

  • 你需要一个额外的包装来完成这项工作。i、 e

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

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

    将两个regexp完全按照原来的方式组合会很好。换句话说,只需使用alternation/pipe操作符进行组合

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

    按原样,直接进入

    /^[0-9]{10}$|^[-]$/
     ↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑     YOUR ORIGINAL REGEXPS, COMBINED AS IS WITH |
    
    这可以表示为

    那会很好的。正如其他人指出的,您不需要在字符类中指定连字符,因此

    /^[0-9]{10}$|^-$/
                  ↑        SIMPLIFY [-] TO JUST -
    
    现在,我们注意到两个备选方案的开头都有一个
    ^
    ,结尾都有一个
    $
    。这有点重复,而且它也使得立即看到regexp始终自始至终都是匹配的变得有点困难。因此,如其他答案中所述,我们可以通过从两个子regexp中取出
    ^
    $
    并使用分组运算符
    ()
    组合它们的内容来重写它:

    相应的可视化是

    这也很好,但您可以使用
    \d
    而不是
    [0-9]
    ,因此最终最简单的版本是:

    /^(\d{10}|-)$/
       ↑↑                  USE \d FOR DIGITS
    
    这可以想象为

    如果出于某种原因您不想“捕获”该组,请使用
    (?:
    ,如中所示

    /^(?:\d{10}|-)$/
       ↑↑                  DON'T CAPTURE THE GROUP
    
    现在,可视化显示未捕获组:

    顺便说一下,在您最初尝试合并这两个regexp时,我注意到您将它们括在括号中,如中所示

    /^([0-9]{10})|([-])$/
      ↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑    YOU PARENTHESIZED THE SUB-REGEXPS
    
    但实际上这并不是必需的,因为pipe(alternation,of“or”)操作符的优先级已经很低了(实际上它的优先级是所有regexp操作符中最低的);“low priority”意味着它只会在两边的事情都已经处理完之后才应用,所以您在这里写的与

    /^[0-9]{10}|[-]$/
    
    然而,由于其他答案中提到的原因,它仍然不起作用,从它的可视化中可以清楚地看出:


    我认为OP想要一个单一的-。不确定…不清楚…但基于
    /^[-]$/
    我相信这正是他想要的。谢谢你,这很完美!虽然我不确定这个例子起作用的区别是什么!正则表达式令人困惑。@Zanko:我在回答中还进一步解释了你的正则表达式失败的原因。如果你有任何进一步的疑问,请告诉我。谢谢你,这也很有效。我仍然对目的感到困惑括号的e。
    a | b
    是一个备选方案:匹配
    a
    b
    。在这里,您的
    a
    模式是
    ^([0-9]{10})
    ,而您的
    b
    模式是
    ([-])$
    。添加括号会限制备选方案不包括
    ^
    $/code>在regxp101屏幕右侧的“解释”,它会提供一些很好的线索。我真的很感谢如此详细的解释!感谢您抽出时间绘制图表。这有助于我更好地理解Regex!谢谢!嘿,我在哪里可以制作这样的Regex图?
    
    /^([0-9]{10})|([-])$/
      ↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑    YOU PARENTHESIZED THE SUB-REGEXPS
    
    /^[0-9]{10}|[-]$/