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