为什么在这种情况下正则表达式是懒惰的而不是贪婪的?

Why is regex being lazy instead of greedy in this case?

这是一个复杂正则表达式的片段:

/\x87([\xA6-\xBf]|\xA6\xF0\x9F)/x

为什么停止并返回 \x87\xA6 而不是 \x87\xA6\xF0\x9F

匹配包含 \x87\xA6\xF0\x9F ?

的字符串时

我认为正则表达式默认是贪婪的并且会尝试消耗最长的模式?

或者仅适用于 *+ 运算符?

有什么方法可以强制它寻找最长的模式吗?不幸的是,在这种情况下不能使用单词边界。


eta:如果我将较短的模式移到最后,显然它会按预期工作

/\x87(\xA6\xF0\x9F|[\xA6-\xBf])/x

真的有那么简单并且正则表达式对模式的顺序敏感吗?

I thought regex was greedy by default and would try to consume the longest pattern?

"Greediness"指的是量词(?*+等)对重复次数的偏好。这与使用 longest 子字符串并不完全相同,当然通常情况下是这样。

交替运算符 | 也有一个偏好:它更喜欢匹配 | 之前的内容,而不是它之后的内容。您可以通过以下方式修复您的模式:

/\x87(\xa6\xF0\x9F|[\xa6-\xbf])/x