我尝试匹配 .*
与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]
[]
答案 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中表现得非常贪婪,并且匹配字符串末尾的空字符串。
我的解决方案是锚定模式:^.*$
。这样做并且看起来最容易理解,那就是“从头到尾匹配所有内容。”
另一种可能性是使用.+
,它消耗整个输入字符串并且第二次不匹配。但它的缺点是不匹配空字符串。