Csharp/C#教程:没有行开头和结尾终结符的Regex.Replace有一些非常奇怪的效果……这里发生了什么?分享


没有行开头和结尾终结符的Regex.Replace有一些非常奇怪的效果……这里发生了什么?

在回答这个问题时, C#Regex Replace和*提出了问题存在的原因。 在播放时我制作了以下代码:

string s = Regex.Replace(".A.", "w*", "B"); Console.Write(s); 

这有输出: B.BB.B

我得到0长度字符串在之前和之后匹配. 字符,但为什么A被2个B取代。

我可以理解B.BBB.B替换ABBB两侧的零长度字符串但实际结果让我感到困惑 – 任何帮助都值得赞赏。

或者正如AakashM所说:

为什么Regex.Matches("A", "w*").Count等于2 ,而不是13

因为 w *是一个贪婪的正则表达式,它试图找到最大的序列。 因此它在点之前匹配"nothing" ,然后在两个点之间"nothing"A然后在第二个点之前"nothing" ,最后在第二个点之后"nothing"

w之后有一颗星

它意味着“ 或多”,这意味着:

表达式w{0,}将具有相同的效果。

如果你想避免它,请使用’plus’,意思是’至少一个’: w+

这是相同的行为

Regex.Replace("", "w*", "B")导致B
Regex.Replace("A", "w*", "B")导致BB

在Regexr上看到它

对于字符串“.A。” w*在第一个点之前匹配空字符串,然后在“A”上,“A”之后的空字符串和最后一个点之后的空字符串。

说明

你可以想到吃掉这些字符的模式, w*吃了“A”,下一个字符是一个点,所以这个匹配完成并被替换。 但是模式继续匹配的起始位置仍然在A和点之间。 点不能匹配,因此它匹配点之前的空字符串,但是此位置完成,下一个开始位置在点之后。

默认情况下,它是贪婪匹配,因此搜索最大匹配。 这就是你得到那个结果的原因。

如果你不情愿地这样做,就像这样

 string s = Regex.Replace(".A.", "\w*?", "B"); 

你会得到这个结果,因为它找到了最小的匹配。

上述就是C#学习教程:没有行开头和结尾终结符的Regex.Replace有一些非常奇怪的效果……这里发生了什么?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 B.BAB.B 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1023123.html

(0)
上一篇 2022年1月7日
下一篇 2022年1月7日

精彩推荐