string subject = "/testfolder
subject = Regex.Replace(subject, "|d|", "17");
Console.Write(subject);
输出为 17/17o17u17t17g17o17i17n17g17
为什么上面的查找和替换失败,它应该什么都不做,而是在每个空格处填充替换变量。它甚至需要正则表达式吗?
string subject = "/testfolder
subject = Regex.Replace(subject, "|d|", "17");
Console.Write(subject);
输出为 17/17o17u17t17g17o17i17n17g17
为什么上面的查找和替换失败,它应该什么都不做,而是在每个空格处填充替换变量。它甚至需要正则表达式吗?
你知道这|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 方法重复匹配尝试时,正则表达式引擎会给予空匹配特殊处理。通常,正则表达式引擎在前一个匹配停止的位置开始搜索下一个匹配。但是,在空匹配之后,正则表达式引擎会在尝试下一个匹配之前前进一个字符。