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

时间:2014-04-09 07:30:37

标签: javascript regex

我希望将JavaScript中的输入字符串与0或2个连续短划线匹配,而不是1,即不是范围。

如果字符串是:

  • -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个破折号。
  4. 如何匹配0或2次出现?

2 个答案:

答案 0 :(得分:4)

<强>答案

如果你将&#34;类似单词&#34;分开空间上的模式,您可以使用此正则表达式,您想要的值将在第一个捕获组中:

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

问题再次是锚定正则表达式,以便相关部分不是完全可选的:这里锚^或强制空白\s播放此作用。


我们想做什么

基本上你想检查你的表达式(两个破折号)是否存在,所以你可以使用?运算符:

(?:--)?

&#34;两个或没有&#34;,(?:...)是非捕获组。

避免混淆

你想要匹配&#34;零或两个破折号&#34;,所以如果这是你的整个正则表达式,它将始终找到一个匹配:在一个空字符串中,{{1} },在--中,- ...这些字符串中匹配的内容将是一个空字符串,但正则表达式将返回匹配。

这是误解的常见原因,因此请记住如果你的正则表达式中的所有内容都是可选的,那么它总能找到匹配。

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

foobar

^(?:--)?$ 分别匹配字符串的开头和结尾。

答案 1 :(得分:2)

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

这是使用&#34; a&#34;举个例子。这将匹配a后跟可选的2个破折号。

修改

根据你的例子,这应该有效

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

编辑2: 我认为Javascript在lookbehinds方面存在问题。

试试这个:

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

Regular expression visualization

Debuggex Demo