2017-01-16 5 views
1

私は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のために言うと、ということですそれは交換を行うべきではありません。

+2

この質問は[エスケープ](http://stackoverflow.com/questions/20505914/escape-special-character-in-regex)とは関係ありませんが、単語の境界があります。 'textToFind'に先行していないときにのみそれをマッチさせるつもりでしたか? '@"(?<!\ w){0}(?!\ w) ''正規表現 '' string.Format'を 'replace.Replace(" $ "、" $$ ")'置換文字列には、リテラル文字として扱う '$'記号が入っているかもしれません)。 –

+1

「ボーナス」部分については、あまり明確ではありませんが、おそらく「@」(?<!\ w)(?<!(?<!\\)\\(?:\\\\)* ){0}(?!\ w) "'は何をしますか? –

+0

私は正確な単語に一致するつもりです。だから私が '@bob'を見つけて置き換えようとすると、 '@bob.com'や\ @bobではなく '@bob'と一致するはずです。同様に\ @bobは\ @bobと一致する必要があります – Frenz

答えて

3

検索語の両端に空白文字または開始/終了文字を必要とする明瞭なルックアラウンドベースの境界で置換することをお勧めします。(?<!\S)および(?!\S)。また、置換パターンに$$を使用して、リテラル$に置き換える必要があります。

私はお勧め:

using System; 
using System.Text.RegularExpressions; 

public class Program 
{ 
    public static void Main() 
    { 
     string text = @"It is @google.com or @google [email protected] \@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変数値の特殊正規表現メタ文字が必要な場合にのみ必要です。

regexのデモはregexstorm.netから入手できます。

+0

あなたの答えをありがとう。ただし、この場合は、検索文字列が '@google'であるため、@ google.comが置き換えられます。一致するのは「@google」を含む単語ではないためです。 – Frenz

+0

['(?<![\ w \\])@google(?!\ w)'](http://regexstorm.net/tester?p=%28%3f%3c!%5b% 5%5c%5c%5c%5d%29%40%28%3f!%5cw%29&i = It +%40google.com + or +%40google + w%40google +%5c%40google +%5c%5c%40google&r =%241some +ドメイン)? –

+0

ほとんどの場合、「@ google.com」と一致しないはずです。それは '@google'とのみ一致する必要があります。したがって、「@google」の後に特殊文字が続くと、それは機能しません。 – Frenz

関連する問題