正则表达式 - 仅查找和替换完整的字符串出现(不是部分匹配)

时间:2010-04-02 23:58:34

标签: c# .net regex replace

我不是很擅长正则表达式,但也许有一种简单的方法来完成这项任务。

我给了一个像"bla @a bla @a1 bla"

这样的字符串

我还获得了{"a", "a2"}{"a1", "a13"}等对,我需要将@a替换为@a2作为第一对,@a1改为@a13第二个String.Replace

问题是,当我使用@a并查找@a1时,它也会替换@a但不应该替换[a-z]*[0-9]+。我需要它完全匹配{{1}}并避免在其他地方部分匹配它。

注意:给定的字符串也可以是括号,逗号,点等。但是,对将始终为{{1}}

请帮我替换正则表达式。

干杯

2 个答案:

答案 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());