为什么在这种情况下正则表达式是懒惰的而不是贪婪的?
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
这是一个复杂正则表达式的片段:
/\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