string subject = "/testfolder
subject = Regex.Replace(subject, "|d|", "17");
Console.Write(subject);
Run Code Online (Sandbox Code Playgroud)
输出为17/17o17u17t17g17o17i17n17g17
为什么上面的查找和替换失败,它应该什么都不做,而是在每个空间填充替换变量.它甚至需要正则表达吗?
你知道,在|d|该|手段or?试着逃避吧!@"\|d\|"
你的正则表达式相当于""(空字符串).
这是因为你必须看到它
(match of empty string) or (match of letter d) or (match of empty string)
Run Code Online (Sandbox Code Playgroud)
始终从左到右匹配,在第一个正匹配时停止.正如我们将看到的,只是第一个条件(空字符串的匹配)在任何地方都是正的,所以它不会去其他匹配.
现在,正则表达式解析器将尝试在字符串的开头匹配您的正则表达式.
它位于"/"(第一个字符):它匹配吗?是""一部分"/"?是的(至少在正则表达式解析器的"头脑"中).现在有趣的是,Regex.Replace将用17... 替换字符串的匹配部分但是有趣的是匹配的部分"/"是"",所以它将替换在"/"with 之前的虚构空字符串"17".所以它会成为"17/"
现在它将转到下一个字符(因为正常情况下将从上一个匹配结束开始尝试正则表达式,但下面有一个警告)t,重做相同并替换它"17t",所以我们将在这一点上:
17/17t
Run Code Online (Sandbox Code Playgroud)
等等.
有一个最后的小技巧(取自msdn)
通过调用Matches方法重复匹配尝试时,正则表达式引擎会给出空匹配特殊处理.通常,正则表达式引擎开始搜索上一个匹配中断的下一个匹配项.但是,在空匹配之后,正则表达式引擎会在尝试下一个匹配之前前进一个字符.
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |