我尝试了以下正则表达式替换:
Regex.Replace("one, two, three, ", ",([.*?]),\s$", ", and$1.");
返回
"one, and two, three."
寻找:
"one, two, and three."
我有一个可以做到这一点的正则表达式。我在那里不需要帮助。
我的问题:懒惰量化的.*?
是不是意味着它会尽可能少地匹配?如果它(显然它没有),它将在“两个”后停止匹配逗号。是否可以从字符串的开头找到第一个匹配?
更新
第一行应为:
Regex.Replace("one, two, three, ", ",(.*?),\s$", ", and$1.");
答案 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$
,.*?,\s$
- 你的正则表达式中的逗号匹配所有逗号。.*?
- 将对所有角色进行非贪婪的匹配,\s$
- 逗号和后跟行尾的空格。所以我们从第一个逗号到最后一个匹配。