。*匹配2次

时间:2014-12-09 14:39:33

标签: c# regex match

我尝试匹配 .*与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]
[]
  • 为什么它与空字符串匹配时第二次匹配整个字符串?
  • 我必须使用什么正则表达式或标志才能获得一次匹配/替换?

2 个答案:

答案 0 :(得分:3)

  • 为什么它与空字符串匹配时,第二次匹配整个字符串?

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

<强>解决方案

使用

.+

匹配一个或多个字符

string text = "sometext";
string expression = ".+";

MatchCollection matches = Regex.Matches(text, expression);

foreach (Match match in matches) {
    Console.WriteLine("[{0}]", match.Groups[0].Value); }

将输出设为

[sometext]

答案 1 :(得分:0)

正如String.replaceAll() anomaly with greedy quantifiers in regex详细解释的那样,*在C#/ .Net中表现得非常贪婪,并且匹配字符串末尾的空字符串。

我的解决方案是锚定模式:^.*$。这样做并且看起来最容易理解,那就是“从头到尾匹配所有内容。

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