.NET正则表达式中的延迟量词

时间:2015-02-10 14:18:56

标签: .net regex

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

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

返回

"one, and two, three."

寻找:

"one, two, and three."

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

我的问题:懒惰量化的.*?是不是意味着它会尽可能少地匹配?如果它(显然它没有),它将在“两个”后停止匹配逗号。是否可以从字符串的开头找到第一个匹配?

更新

第一行应为:

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

2 个答案:

答案 0 :(得分:2)

首先,[.*?]不正确。 character class定义了一组字符。说,"匹配类"指定的一个字符。因此,你的正则表达式不符合你的期望。你不能围绕.*?包装一个班级;它匹配 实施后的字符(.*?)。

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

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

注意: *?表示非贪婪匹配意味着"零或更多 - 最好尽可能少"。它在上下文中使用的方式(与字符串$的结尾一起使用),令牌将贪婪地匹配第一个逗号和之后的每个字符;前进到字符串中的下一个标记并持续保持回溯,直到它在字符串位置结束时断言。

答案 1 :(得分:1)

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

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

DEMO

  • ,.*?,\s$ - 你的正则表达式中的逗号匹配所有逗号。
  • .*? - 将对所有角色进行非贪婪的匹配
  • ,\s$ - 逗号和后跟行尾的空格。所以我们从第一个逗号到最后一个匹配。