Javascript 贪婪的正则表达式似乎是非贪婪的
Javascript greedy regex appears non-greedy
我想匹配一个由三部分组成的字符串。第一部分由一个或多个 a
个字符组成,第二部分由一个或多个 b
个字符组成,第三部分由零个或多个 c
个字符或零个或多个字符组成C
个字符,但不是 c
和 C
.
的混合
因此,我编写了以下正则表达式:
/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
] 尽可能。但是查找 C
或 c
是可选的。
我想匹配一个由三部分组成的字符串。第一部分由一个或多个 a
个字符组成,第二部分由一个或多个 b
个字符组成,第三部分由零个或多个 c
个字符或零个或多个字符组成C
个字符,但不是 c
和 C
.
因此,我编写了以下正则表达式:
/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
] 尽可能。但是查找 C
或 c
是可选的。