如何告诉RegEx(.NET版本)获得最小的有效匹配而不是最大的?
答案 0 :(得分:153)
对于.*
或.+
等正则表达式,请附加问号(.*?
或.+?
)以匹配尽可能少的字符。要选择性匹配某个部分(?:blah)?
,但除非绝对必要,否则请使用(?:blah){0,1}?
之类的内容。对于重复匹配(使用{n,}
或{n,m}
语法),请添加问号以尝试尽可能少地匹配(例如{3,}?
或{5,7}?
)。
regular expression quantifiers上的文档也可能会有所帮助。
答案 1 :(得分:60)
非贪婪的算子?
。像这样:
.*?
答案 2 :(得分:29)
非贪婪的算子并不意味着最短的匹配:
abcabk
a.+?k
将匹配整个字符串(在此示例中),而不是仅匹配最后三个符号。
我想实际找到最小的匹配。
这是“a
”的最后一次匹配仍然允许k
的所有匹配。
我想这样做的唯一方法就是使用像:
这样的表达式a[^a]+?k