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

ske*_*gse 2 javascript regex regex-greedy

我想匹配一个由三部分组成的字符串.第一部分由一个或多个a字符组成,第二部分由一个或多个b字符组成,第三部分由零个或多个c字符或零个或多个C字符组成,但不包含c和的混合C.

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

/a+b+(C*|c*)/
Run Code Online (Sandbox Code Playgroud)

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

aaaaabbcc
Run Code Online (Sandbox Code Playgroud)

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

/a+b+((C*)|(c*))/
Run Code Online (Sandbox Code Playgroud)

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

aaaaabbCC
Run Code Online (Sandbox Code Playgroud)

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

/a+b+(([Cc])\2*)?/
Run Code Online (Sandbox Code Playgroud)

Ori*_*iol 5

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

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

/a+b+(C+|c+)?/
Run Code Online (Sandbox Code Playgroud)

也就是说,如果它发现C它将尽可能多地匹配C,如果它找到c它将尽可能多地匹配c.但发现C或是c可选的.