使用连续 \d 和 \w 时了解正则表达式的行为 [重复]
Posted
技术标签:
【中文标题】使用连续 \\d 和 \\w 时了解正则表达式的行为 [重复]【英文标题】:Understanding behavior of regex when using consecutive \d and \w [duplicate]使用连续 \d 和 \w 时了解正则表达式的行为 [重复] 【发布时间】:2021-01-25 03:51:42 【问题描述】:我试图了解regex
在连续使用\d
和\w
来匹配句子中的单词和数字时的行为。我搜索了类似的问题,但找不到合适的匹配项(如果有重复,请告诉我)。
# Example sentence
"Adam has 100 friends. Bill has 23 friends. Cindy has 5 friends."
当我使用正则表达式 [A-Za-z]+\s\w+\s\d+\w
时,它会返回匹配项:
Adam has 100
Bill has 23
但不适合
Cindy has 5
因为贪婪搜索的数字 (\d+
) 后面没有任何单词字符 (\w
),所以我本来预计根本没有匹配项;它们后面跟着一个空格。我认为,不知何故,\w
在第一次出现任何数字之后匹配数字。我以为\d+
会用尽搜索中的数字。你能帮我理解这里发生了什么吗?
谢谢
【问题讨论】:
您能说明一下您期望得到什么样的答案吗?解释模式是如何工作的?那就看regex101.com/r/LWD5hM/1/debugger 你好维克托。我最初并不理解这种行为,因为我不知道回溯以通过贪婪匹配来容纳更多的查询模式。下面的答案澄清了这一点。感谢您的链接! 【参考方案1】:我认为 \d+ 会用尽搜索中的数字长度
不,事实并非如此。 \d+
在下一个 \w
之前匹配尽可能多的数字(也匹配数字,即[a-zA-Z_0-9]
)强制正则表达式引擎回溯一个位置,以便\w
可以匹配一个单词字符。
如果您不希望发生这种回溯,请使用possessive quantifier ++
:
[A-Za-z]+\s\w+\s\d++\w
但请注意,\d++w
模式在所有 3 种情况下总是会失败,因为 \d++
不会回溯,\w
将永远无法匹配数字。
这种模式只有在结尾有像Chapter is 23A
这样的非数字单词字符时才会成功。
RegEx Demo
【讨论】:
因为并非所有正则表达式都支持所有格量词,所以原子组可能是更通用的解决方案。 是的,但即使是原子组也不支持所有正则表达式风格 @Atakan:仅供参考[A-Za-z]+\s\w+\s(?>\d+)\w
是使用原子组的正则表达式以上是关于使用连续 \d 和 \w 时了解正则表达式的行为 [重复]的主要内容,如果未能解决你的问题,请参考以下文章