2012-03-18 13 views
0

私は、次の文字列で<b>c++</b>c++を交換しようとしている:正規表現のネストされた数量詞+

"Select the projects entry and then select VC++ directories. Select show" 

私はそれが

このコードを使用して
"Select the projects entry and then select V<b>C++</b> directories. Select show" 

イムになりたい:

string cssOld = Regex.Replace(
    "Select the projects entry and then select VC++ directories. Select show", 
    "c++", "<b>${0}</b>", RegexOptions.IgnoreCase); 

次のエラーが発生します。
System.ArgumentException: parsing "c++" - Nested quantifier +.

このコードは、他のテキスト(!C++)でも正常に動作します。 +演算子がRegexライブラリに例外をスローさせるようです。

答えて

2

あなたはregexで特殊文字をエスケープする必要があります

string cssOld = Regex.Replace(
    "Select the projects entry and then select VC++ directories. Select show ", 
    @"c\+\+", "${0}", RegexOptions.IgnoreCase); 
+0

ありがとうございました。私は+演算子に対応する必要があるだけですか、この例外を引き起こす可能性のある他の演算子(*、&、\ etc)がありますか? –

+0

これは他の特殊文字でも確認できます:http://stackoverflow.com/questions/399078/what-special-characters-must-be-escaped-in-regular-expressionsその中には次のものがあります:(\、*、+、?、|、{、[、(、)、^、$、。、#、空白) – ionden

+0

Regex.Escapeも同様に仕事をしました。だから私は自分のコードを変更しました: string cssOld = Regex.Replace(Regex.Escape( "プロジェクト項目を選択し、VC++ディレクトリを選択すると、 を選択してください)、Regex.Escape(" C++ ")、" $ { 0} "、RegexOptions.IgnoreCase); それは正常に動作します。皆さん、ありがとうございました。 –

4

+は、正規表現の特殊文字です。それは "前の文字の1つまたは複数と一致する"ことを意味します。

リテラル+文字を一致させるために、あなたは(リテラル@""内)\+を書き込むことによって、それをエスケープする必要があり

Regex.Escapeを使用し、任意のリテラル文字にマッチします。

+0

オーケー感謝たくさん。私は+演算子に対応する必要があるだけですか、この例外を引き起こす可能性のある他の演算子(*、&、\ etc)がありますか? –

+0

ありがとう。 Regex.Escapeも同様に仕事をしました。だから私は自分のコードを変更しました: string cssOld = Regex.Replace(Regex.Escape( "プロジェクト項目を選択し、VC++ディレクトリを選択すると、 を選択してください)、Regex.Escape(" C++ ")、" $ { 0} "、RegexOptions.IgnoreCase); それは正常に動作します。皆さん、ありがとうございました。 –

関連する問題