【发布时间】:2021-10-07 21:45:05
【问题描述】:
正则表达式:/^(\d+)[^_]/gm
测试字符串:12_34
我希望这个正则表达式不匹配测试字符串,因为 \d+ 是 贪婪 吃数字 1 和 2 和 [^_]在_ 上失败。
但它意外匹配仅与 Group1 中的 1。我哪里错了?
我试图找到一个与测试字符串“12”或“12xx”中的数字匹配但与“12_xx”不匹配的正则表达式
示例:
https://regex101.com/r/0QRTjs/1/
方言:最后我会使用 Microsoft System.Text.RegularExpressions。
【问题讨论】:
-
您应该阅读Backtracking 和Atomic Groups。基本上,“贪婪”的意思是“尽可能允许回溯”。您期望的行为可以通过原子组实现。
-
对于您的特定示例,您可以只使用否定的 Lookahead,因为您可能不需要在匹配中的数字后面包含字符:
^(\d+)(?!\d|_)。见this demo。 -
好的,所以功能 Backtracking 导致我的“意外行为”,因为正则表达式比我想象的要多。我可以使用 Atomic Groups 来避免回溯。
^((?>\d*))[^_]似乎可以解决问题。谢谢艾哈迈德! -
^((?>\d*))([^_]|$)正确匹配我的纯数字行。