.* 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]
[]
  • 为什么当空字符串已经匹配整个字符串时,它会再次匹配空字符串?
  • 我必须使用哪些正则表达式或标志才能仅获得单个匹配/替换?

.* matches 2 times

  • 为什么当空字符串已经匹配整个字符串时,它会再次匹配空字符串?

    因为正则表达式是.*它将匹配零个或多个匹配项。因此,零出现给出一个空字符串,从字符串输入的末尾

溶液

.+

匹配一个或多个字符

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 中表现得非常贪婪,并且也匹配字符串末尾的空字符串。

我的解决方案是锚定模式:^.*$ .这完成了工作,似乎最容易理解,那就是">从头到尾匹配所有内容一次"。

另一种可能性是使用 .+ ,这会消耗整个输入字符串并且不能第二次匹配。但是,它的缺点是不匹配空字符串。