替换包含特殊字符的精确匹配单词

时间:2017-01-16 06:03:56

标签: c# regex

我遇到了How to search and replace exact matching strings only。但是,当有以@开头的单词时,它不起作用。我的小提琴https://dotnetfiddle.net/9kgW4h

string textToFind = string.Format(@"\b{0}\b", "@bob");
Console.WriteLine(Regex.Replace("@bob!", textToFind, "me"));// "@bob!" instead of "me!"

此外,除了我想要做的是,如果一个单词以\ @说例如\ @myname开头,如果我试图找到并替换@myname,它不应该这样做取代

1 个答案:

答案 0 :(得分:3)

我建议使用明确的基于环视的边界替换前导和尾随字边界,这些边界将需要搜索字(?<!\S)(?!\S)两端的空格字符或字符串的开头/结尾。此外,您需要在替换模式中使用$$替换为文字$

我建议:

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        string text = @"It is @google.com or @google w@google \@google \\@google";
        string result = SafeReplace(text,"@google", "some domain", true);
        Console.WriteLine(result);
    }


    public static string SafeReplace(string input, string find, string replace, bool matchWholeWord)
    {
        string textToFind = matchWholeWord ? string.Format(@"(?<!\S){0}(?!\S)", Regex.Escape(find)) : find;
        return Regex.Replace(input, textToFind, replace.Replace("$","$$"));
    }
}

请参阅C# demo

只有在Regex.Escape(find)变量值中需要特殊的正则表达式元字符时才需要find

正则表达式演示可在regexstorm.net处获得。