.* matches 2 times
本文关键字:times matches | 更新日期: 2023-09-27 18:33:45
我试图将.*
与 C# 正则表达式匹配,结果它匹配任何字符串两次:第一次是完整字符串,第二次是空字符串。我希望.*
在一场比赛中匹配所有内容。我完全不明白为什么应该这样做以及如何防止这种情况。
长话短说:我需要替换部分文件名,并有可能无条件地替换为某个替换字符串。使用空字符串作为模式将匹配并将替换放在字符串的每个字符之后,如 Regex.Replace
中所述。因此,我在替换之前将空字符串替换为.*
。但事实证明,这是执行替换双倍。
为了演示正在发生的事情,我使用了:
string input= "sometext";
string pattern= ".*";
MatchCollection matches = Regex.Matches(input, pattern);
foreach (Match match in matches) {
Console.WriteLine("[{0}]", match.Groups[0].Value); }
这会产生:
[sometext]
[]
- 为什么当空字符串已经匹配整个字符串时,它会再次匹配空字符串?
- 我必须使用哪些正则表达式或标志才能仅获得单个匹配/替换?
-
为什么当空字符串已经匹配整个字符串时,它会再次匹配空字符串?
因为正则表达式是
.*
它将匹配零个或多个匹配项。因此,零出现给出一个空字符串,从字符串输入的末尾
溶液
用
.+
匹配一个或多个字符
string text = "sometext";
string expression = ".+";
MatchCollection matches = Regex.Matches(text, expression);
foreach (Match match in matches) {
Console.WriteLine("[{0}]", match.Groups[0].Value); }
将输出作为
[sometext]
正如正则表达式中带有贪婪量词的 String.replaceAll(( 异常详细解释的那样,*
在 C#/.Net 中表现得非常贪婪,并且也匹配字符串末尾的空字符串。
我的解决方案是锚定模式:^.*$
.这完成了工作,似乎最容易理解,那就是">从头到尾匹配所有内容一次"。
另一种可能性是使用 .+
,这会消耗整个输入字符串并且不能第二次匹配。但是,它的缺点是不匹配空字符串。