C# Regex Replace and *
本文关键字:and Replace Regex | 更新日期: 2023-09-27 18:24:05
我是一名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*$
时,锚定意味着只有一个可能的匹配,并且更像这种情况下的预期。