.NET 正则表达式中的惰性量词

Lazy quantifier in .NET regular expression

我尝试了以下正则表达式替换:

Regex.Replace("one, two, three, ", ",([.*?]),\s$", ", and.");

哪个returns

"one, and two, three."

正在寻找:

"one, two, and three."

我有一个正则表达式可以做到这一点。我在那里不需要帮助。

我的问题:惰性量化 .*? 不是意味着匹配越少越好吗?如果匹配(显然没有),它将在 "two" 之后的逗号处停止匹配。它是否会从字符串的开头找到第一个可能的匹配项?

更新:

第一行应为:

Regex.Replace("one, two, three, ", ",(.*?),\s$", ", and.");

,.*?,\s$ 匹配从第一个逗号到最后一个逗号的所有字符,因为 . 也匹配字符逗号。

,([^,]*),\s$

DEMO

  • ,.*?,\s$ - 正则表达式中的逗号匹配所有逗号。
  • .*? - 将对所有字符进行非贪婪匹配直到
  • ,\s$ - 逗号和 space 后跟行尾。所以我们得到了从第一个逗号到最后一个逗号的匹配。

首先,[.*?] 是不正确的。 character class 定义一组字符。说,"match one character specified by the class"。因此,您的正则表达式不符合您的预期。你不能用 class 包裹 .*?;它匹配 字符(.*?)在实现时字面意思。

您可以更改分组结构以使用否定字符 class 来简单地避免贪婪地匹配第一个逗号和之后的所有内容,直到字符串结尾。

String result = Regex.Replace("one, two, three, ", @"([^,]*),\s$", " and.");
Console.WriteLine(result); //=> "one, two, and three."

注意: *? 确实表示非贪婪匹配,意思是 "zero or more — preferably as few as possible"。它在此处上下文中的使用方式(与字符串结尾一起使用 $ anchor),令牌将贪婪地匹配第一个逗号和之后的每个字符;前进到字符串中的下一个标记并不断回溯,直到它在字符串位置的末尾断言。