繁体   English   中英

正则表达式匹配0个或确切的字符数

[英]Regular expression match 0 or exact number of characters

我想用0或2个连续的破折号(而不是1)匹配JavaScript中的输入字符串,即不在范围内。

如果字符串是:

  • -g:"apple" AND --projectName:"grape" :它应该与--projectName:"grape"匹配。
  • -g:"apple" AND projectName:"grape" :它应该匹配projectName:"grape"
  • -g:"apple" AND -projectName:"grape" :它不应该匹配,即返回null。
  • --projectName:"grape" :它应该匹配--projectName:"grape"
  • projectName:"grape" :它应该与projectName:"grape"匹配。
  • -projectName:"grape" :它不应该匹配,即返回null。

为了简化此问题(考虑此示例),RE应该匹配前面的0或2个破折号,然后是后面的任何破折号。 我会找出其余的。 问题仍然归结为匹配0或2的破折号。

  1. 使用-{0,2}匹配0、1、2破折号。
  2. 使用-{2,}匹配2个或更多的破折号。
  3. 使用-{2}仅匹配2个破折号。

如何匹配0或2次出现?

回答

如果在空格上拆分“类似单词”的模式,则可以使用此正则表达式,并且所需的值将在第一个捕获组中:

(?:^|\s)((?:--)?[^\s-]+)
  • \\s是任何空格字符(制表符,空格,换行符...)
  • [^\\s-]除了空格字符或-

问题再次是锚定正则表达式,以便相关部分不是完全可选的:锚定^或强制空格\\s扮演了这个角色。


我们想做什么

基本上,您要检查表达式(两个破折号)是否存在,因此可以使用? 运营商:

(?:--)?

“要么两个,要么都不”, (?:...)是一个非捕获组。

避免混乱

要匹配“零个或两个破折号”,因此,如果这是你的整个正则表达式它总是会找到一个匹配:一个空字符串,在---foobar ......会是怎样的比赛,这些字符串是一个空字符串,但是正则表达式将返回一个匹配项。

这是造成误解的常见原因,因此请记住以下规则: 如果您的正则表达式中的所有内容都是可选的,它将始终找到匹配项。

如果您只想在整个字符串由零或两个破折号组成的情况下返回匹配项,则需要锚定正则表达式:

^(?:--)?$

^$分别匹配字符串的开头和结尾。

a(-{2})?(?!-)

这以“ a”为例。 这将匹配,后跟可选的两个破折号。

编辑:

根据您的示例,这应该有效

(?<!-)(-{2})?projectName:"[a-zA-Z]*"

编辑2:我认为Javascript有问题。

尝试这个:

[^-](-{2})?projectName:"[a-zA-Z]*"

正则表达式可视化

Debuggex演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM