我不是很擅长正则表达式,但也许有一种简单的方法来完成这项任务。
我给了一个像"bla @a bla @a1 bla"
我还获得了{"a", "a2"}
,{"a1", "a13"}
等对,我需要将@a
替换为@a2
作为第一对,@a1
改为@a13
第二个String.Replace
。
问题是,当我使用@a
并查找@a1
时,它也会替换@a
但不应该替换[a-z]*[0-9]+
。我需要它完全匹配{{1}}并避免在其他地方部分匹配它。
注意:给定的字符串也可以是括号,逗号,点等。但是,对将始终为{{1}}
请帮我替换正则表达式。
干杯
答案 0 :(得分:5)
使用\b
:
@a\b
\b
是零宽度字边界。基本上这意味着它匹配过渡从单词字符(字母,数字,下划线)到非单词字符(其他所有)或反之亦然但不“消耗”输入的任何部分(这是零宽度部分)。
例如:
string s1 = "bla @a bla @a1 bla ";
string s2 = Regex.Replace(s1, @"@a\b", "foo");
Console.WriteLine(s2);
输出:
bla foo bla @a1 bla
答案 1 :(得分:3)
使用带有lookbehind和单词边界的正则表达式:
Regex regex = new Regex(string.Format(@"(?<!\w)@{0}\b", from));
string result = regex.Replace(input, "@" + to)
注意:我在这里使用的事实是你的对已知是字母数字。如果事实并非如此,则上述情况不起作用。
或者,您不需要此任务的正则表达式。您可以在空格上分割输入(假设空格始终是分隔符),迭代各部分并查找并替换您要查找的部分,然后重新加入以形成最终结果。
string result = string.Join(" ",
input.Split(' ')
.Select(x => x == "@" + from ? "@" + to : x)
.ToArray());