.NET正则表达式替换单行匹配未知字符。

5
这让我感到非常困惑。为什么在下面的代码中会出现重复的替换字符串:

这让我感到非常困惑。为什么在下面的代码中会出现重复的替换字符串:

static void Main(string[] args)
{
    String input = "test";
    String pattern = ".*";
    String replacement = "replace";
    Console.WriteLine(Regex.Replace(input, pattern, replacement));
    Console.Read();
}

这将输出到控制台:

replacereplace

我了解正则表达式会在匹配结束行符时出现问题,但实际上没有这些行符。我也知道该模式可以匹配空内容,但显然输入不是空的。这种情况发生在 .Net 3.5 和 4.0 中,并且我使用 SingleLine 和 MultiLine 也得到了相同的结果。
我知道有几种替代方法可以实现我的期望,但更想知道其他所有的 .* 匹配到了什么。
2个回答

4
你会得到两个替换结果的原因是因为使用 .* 时会得到两个匹配项: "test"""。如果你将 .* 改为 .+,它就会按照你的期望工作:
String pattern = ".+";

另一种选择是添加字符串开头锚点:

String pattern = "^.*"; // I know this looks like a smiley

1
你让我在终点线上追赶 :) - FailedDev
我同意,这确实解决了问题,但我想知道原因。 - Joshua Belden
Chrome应用程序“Regex Tester App”显示相同的行为,直到您检查全局标志。我只希望.Net也能实现这个标志... - Spiralis

2
它既不匹配任何内容,又匹配所有内容,因此你会得到两个匹配项和两个替换项。

什么玩意儿?我怎么以前从没遇到过这个问题。 - Joshua Belden
2
@JoshuaBelden,也许你已经运行它了,但你从未发现它 :) - FailedDev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接