Javascript 贪婪的正则表达式似乎是非贪婪的

Javascript greedy regex appears non-greedy

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

的混合

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

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

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

aaaaabbcc

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

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

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

aaaaabbCC

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

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

你必须把 * 放在括号外面!

var input = "aaaaabbc";

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

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

这是一个与预期字符串匹配的正则表达式:

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

也就是说,如果它找到一个C它会匹配尽可能多的C,如果它找到一个c它会匹配尽可能多的c ] 尽可能。但是查找 Cc 是可选的。