2017-03-13 16 views
3

正規表現を見つけようとしているのですが、正確な単語にマッチさせて別の正規表現に置き換えようとしています。しかし、私が使った表現は、@のような特定の文字で始まる単語でも置き換えます。ここで 正規表現を見つけて特定の単語に一致させる

static public string ReplaceWholeWord(this string original, string wordToFind, string replacement, RegexOptions regexOptions = RegexOptions.None){ 
     string pattern = String.Format(@"\b{0}\b", wordToFind); 
     string ret = Regex.Replace(original, pattern, replacement, regexOptions); 
     return ret; 
} 

が結果だ:ここで

は私のコードです

​​

結果:現時点では

(@xがnullでない)場合、Iのみそれらの前に@文字を持つ単語を一致させないようにする必要があります。

+1

'@'と 't'の間に単語境界があります。空白で囲まれた単語だけを置き換える場合は、 '@"(?<!\ S){0}(?!\ S) "'を試してください。この場合、単語境界とは何を考えますか?あるいは '@'の後にマッチするのを避けたいですか?それで '@ '\ b(?<!@){0} \ b" ' –

+0

@WiktorStribiżewを使って、' test'を 'if(test ...)'に置き換えて ''? \ S)... 'は一致しません。要件を明確にし、どの文字が「単語の一部」とみなされ、どの文字がそうでないかを明示する必要があります。 –

+0

@MoezRebai、あなたは、どのような文字が「単語の一部」とみなされ、どの文字がそうでないかを明示してください。 –

答えて

3

あなただけのすぐ@シンボルで先行している単語全体にマッチ避けたいので、あなただけのnegative lookbehindを追加する必要があります。

@"\b(?<[email protected]){0}\b" 
    ^^^^^^ 

regex demoを参照してください。

正規表現は最初に単語の境界位置に一致してから、前の文字をチェックし、@の場合は一致しません。直前のcharが@でない場合のみ、末尾の単語境界を持つtestが一致します。

+0

私はその2番目の解決策を好んでいます。 –

+0

さらに調整することができます: '#'の前にある単語のマッチングを避ける必要がある場合は、不要な文字を文字クラスに入れ、 '@" \ b(?<![@#]){0 } \ b "'。以前に文字*シーケンス*を持つ単語のマッチングを避ける予定の場合は、次のように変更してください。 {@}] == \ s *){0} \ b "'(つまり、 '=='と先行していない単語や空白文字は0+)です。 –

関連する問題