Javascript贪婪的正则表达式显得非贪婪

时间:2016-08-07 20:37:24

标签: javascript regex regex-greedy

我想匹配一个由三部分组成的字符串。第一部分由一个或多个a字符组成,第二部分由一个或多个b个字符组成,第三部分由零个或多个c个字符组成,或者零个或多个C个字符,但不是cC的混合。

因此,我写了以下正则表达式:

/a+b+(C*|c*)/

并立即注意到它无法贪婪地匹配以下字符串中的尾随c

aaaaabbcc

包装or子句的内部子句不能解决意外行为:

/a+b+((C*)|(c*))/

但有趣的是,两个正则表达式都匹配以下内容,其中C个字符与or的第一个子句匹配:

aaaaabbCC

以下正则表达式准确地捕获了语义,但我想理解为什么原始正则表达式会出现意外行为。

/a+b+(([Cc])\2*)?/

3 个答案:

答案 0 :(得分:5)

你的正则表达式不起作用,因为它首先尝试C*,它匹配空字符串,所以它满足了or子句。然后,它不会尝试检查c*是否可以匹配更多字符。

这是一个正则表达式,它符合预期的字符串:

/a+b+(C+|c+)?/

也就是说,如果它找到C,它将匹配尽可能多的C,如果它找到c,它将匹配更多c可能。但是找到Cc是可选的。

答案 1 :(得分:2)

您必须将*置于括号之外!

答案 2 :(得分:1)



var input = "aaaaabbc";

// if you want to pick up c
console.log(/a+b+(c|C)*/.exec(input).pop());