2016-05-09 18 views
2

正規表現にAsp.netを使用する。regexを使って特殊文字を置き換える方法

単語全体を置き換えるために使用したい拡張方法を書いています。単語は '&'のような1つの特殊文字でもかまいません。

この場合、 '&'を 'and'に置き換えたいのですが、同じテクニックを使用して 'and'から '&'に戻す必要があるため、単語全体のみで動作する必要があります「手」のような拡張された言葉ではない。

'\ bWORD \ b'で始まる正規表現パターンのいくつかのバリエーションを試しましたが、これはアンパサンドではまったく機能しませんでした。言葉の周りのスペースも削除されます。つまり、 "health & beauty"のようなフレーズが "healthandbeauty"になります。

助けてください。ここで

は、拡張メソッドです:

public static string ReplaceWord(this string @this, 
     string wordToFind, 
     string replacement, 
     RegexOptions regexOptions = RegexOptions.None) 
    { 
     Guard.String.NotEmpty(() => @this); 
     Guard.String.NotEmpty(() => wordToFind); 
     Guard.String.NotEmpty(() => replacement); 

     var pattern = string.Format(@"\s{0}\s", wordToFind); 

     return Regex.Replace(@this, pattern, replacement, regexOptions); 
    } 
+1

'var pattern = string.Format(@"(?<!\ S){0}(?!\ S) "、wordToFind); ' –

+0

Works!乾杯ウィクトル、あなたはスターです。 –

答えて

1

は、スペースで囲む必要があります(または文字列の先頭や末尾に位置する)は、動的文字列を一致させるためには、否定先読みを使用することができます。

var pattern = string.Format(@"(?<!\S){0}(?!\S)", wordToFind); 
           ^^^^^^^ ^^^^^^  

またはより安全:

var pattern = string.Format(@"(?<!\S){0}(?!\S)", Regex.Escape(wordToFind)); 
               ^^^^^^^^^^^^^ 

(?<!\S) lookbehindは、単語に空白以外の文字が前に付いていない場合は一致しません。また、単語に空白以外の文字が続かない場合は(?!\S) lookaheadが失敗します。

関連する問題