C# 正则表达式替换整个单词
我有这个字符串: 元素60:80节点1 2 3 Elm 55元素60 mpc 1:999元素123 我想将字符串中的所有“Elm”、“E”和“Elem”替换为“Element”。我不想将“Node”替换为“nodeElement”,所以我需要使用单词边界来匹配整个单词 为此,我使用这个正则表达式:C# 正则表达式替换整个单词,c#,regex,C#,Regex,我有这个字符串: 元素60:80节点1 2 3 Elm 55元素60 mpc 1:999元素123 我想将字符串中的所有“Elm”、“E”和“Elem”替换为“Element”。我不想将“Node”替换为“nodeElement”,所以我需要使用单词边界来匹配整个单词 为此,我使用这个正则表达式: Regex regexElements = new Regex("\b(E|Elm|Elem)\b", RegexOptions.IgnoreCase); foreach(Match m in re
Regex regexElements = new Regex("\b(E|Elm|Elem)\b", RegexOptions.IgnoreCase);
foreach(Match m in regexElements.Matches(str))
{
MessageBox.Show("Match: " + m.Value");
}
str = regexElements.Replace(str, "Element"); //str is my string
但我没有看到任何替换,也没有显示MessageBox。
有趣的是,我仍然可以使用记事本++搜索找到想要的单词。
这里发生了什么?
谢谢无需使用正则表达式:
String yourString = "Element 60:80 Node 1 2 3 Elm 55 Element 60 mpc 1:999 Elem 123" ;
yourString = yourString.Replace("Elem", "Element").Replace("E ", "Element ").Replace("Elm", "Element");
你需要原始的正则表达式
\b
本身并不意味着单词边界(我不完全确定它的意思,但它不是字面意义上的b
,因此可能有点像退格)。因此,您可以使用\\b
或者像在我的评论中一样使用@
,这样最终的代码就变成:
Regex regexElements = new Regex(@"\b(E|Elm|Elem)\b", RegexOptions.IgnoreCase);
foreach(Match m in regexElements.Matches(str))
{
MessageBox.Show("Match: " + m.Value);
}
str = regexElements.Replace(str, "Element"); //str is my string
或
我还建议使用更为优化的正则表达式:
@"\bE(le?m)?\b"
由于我是正则表达式新手,我想了解为什么最初解决这个问题的方法不起作用。但是谢谢你的建议。是的,这将取代任何出现的
E
/Elem
和Elm
,但是,OP说他们不想取代NodeElem
等场景。你使用的是n.Value
而不是m.Value
。另外,您可以将regex简化为@“\bE(le?m)?\b”
我已经修复了发布的代码,谢谢。您可以查看Lookahead regex,以下链接可能会有所帮助,如果您使用的是Visual Studio(VS2012的版本和之后版本),只要有源文件,就可以在IDE中进行替换。崇高的文字也能做到。@James谢谢!难怪,所提供的示例代码=P有很多问题
@"\bE(le?m)?\b"