0
    string subject = "/testfolder
    subject = Regex.Replace(subject, "|d|", "17");
    Console.Write(subject);

输出为 17/17o17u17t17g17o17i17n17g17

为什么上面的查找和替换失败,它应该什么都不做,而是在每个空格处填充替换变量。它甚至需要正则表达式吗?

4

1 回答 1

9

你知道这|d|意味着|什么or?尝试逃脱它!@"\|d\|"

您的正则表达式相当于""(空字符串)。

这是因为您必须将其视为

(match of empty string) or (match of letter d) or (match of empty string)

总是从左到右匹配,在第一个正匹配处停止。正如我们将看到的,只有第一个条件(空字符串匹配)在任何地方都是正的,所以它永远不会去其他匹配。

现在,正则表达式解析器将尝试在字符串的开头匹配您的正则表达式。

它在“/”(第一个字符)处:匹配吗?是""一部分"/"?是的(至少在正则表达式解析器的“头脑”中)。现在有趣的是,它Regex.Replace会将字符串的匹配部分替换为... 但有趣的是 is17的匹配部分,所以它将替换一个假想的空字符串,它就在with之前。所以会变成"/""""/""17""17/"

现在它将转到下一个字符(因为通常正则表达式将在上一场比赛结束时开始尝试,但有一个警告写在下面),t重做同样的并将其替换为"17t",所以我们将在这一点:

17/17t

等等。

最后一个小技巧(取自msdn

当通过调用 Matches 方法重复匹配尝试时,正则表达式引擎会给予空匹配特殊处理。通常,正则表达式引擎在前一个匹配停止的位置开始搜索下一个匹配。但是,在空匹配之后,正则表达式引擎会在尝试下一个匹配之前前进一个字符。

于 2013-08-16T14:39:42.777 回答