C# Regex Replace and *



我是一名perl程序员,会做一些C#。面临Regex.Replace关于零或多个断言的奇怪问题,*。

假设我想用一个字母替换零个或多个字母。在perl中,我可以这样做:

my $s = "A";
$s =~ s/w*/B/;
print $s;
$s now = "B"

但如果我尝试在C#中做同样的事情,比如:

string s = Regex.Replace("A", @"w*", "B");
s now = "BB"

文档确实说"*字符在替换模式中不被识别为元字符"

为什么?如果你想用一点正则表达式来填充一些可能不存在的剩余字符串(比如末尾的".*?"),有什么办法吗

(这是一个愚蠢的例子,但你明白了)

用^开始您的模式,用$结束它,您的问题就解决了。

string s = Regex.Replace("AAAA", @"^w*$", "B");
Console.Write(s);

或者,您可以停止使用+运算符而不是*运算符对0长度字符串进行匹配:

string s = Regex.Replace("AAAA", @"w+", "B");
Console.Write(s);

Matt Fellows对如何修复它有正确的答案。不过我相信我可以试着解释为什么它会这样坏。。。

考虑一下:

Regex.Replace("AAA",@"Z*","!!|$&|")

它将返回:

!!!||A!!!||A!!!||A!!!||

在这种情况下,Z*将匹配一系列长度为零的字符串,每个字符串位于一个a字符之前或之后。$&放入匹配的字符串,在这种情况下,我们可以看到它是空的。

我相信也会发生类似的事情

Regex.Replace("AAA", @"A*", "!!!|$&|")

哪个返回

!!!|AAA|!!!||

A*匹配从开头开始,匹配"AAA"。然后匹配",然后停止。

我不确定在这种情况下这是否是期望的行为,但我怀疑这是a*匹配零长度字符串方式的必要副作用。

当然,当您将模式更改为^A*$时,锚定意味着只有一个可能的匹配,并且更像这种情况下的预期。

最新更新