查找并替换正则表达式C#

Luk*_*akk 0 c#

    string subject = "/testfolder
    subject = Regex.Replace(subject, "|d|", "17");
    Console.Write(subject);
Run Code Online (Sandbox Code Playgroud)

输出为17/17o17u17t17g17o17i17n17g17

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

xan*_*tos 9

你知道,在|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方法重复匹配尝试时,正则表达式引擎会给出空匹配特殊处理.通常,正则表达式引擎开始搜索上一个匹配中断的下一个匹配项.但是,在空匹配之后,正则表达式引擎会在尝试下一个匹配之前前进一个字符.

  • 他说你需要逃避| 字符,所以代码正确解释它. (3认同)