.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$
,.*?,\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),令牌将贪婪地匹配第一个逗号和之后的每个字符;前进到字符串中的下一个标记并不断回溯,直到它在字符串位置的末尾断言。
我尝试了以下正则表达式替换:
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$
,.*?,\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),令牌将贪婪地匹配第一个逗号和之后的每个字符;前进到字符串中的下一个标记并不断回溯,直到它在字符串位置的末尾断言。