したがって、Microsoft Visual Studioには、正規表現にコンパイルされる文字列があります。私の文字列は「#(\ d +(。\ d +)?)=(\ d +(。\ d +)?)」です。\ dが認識されないエスケープ文字であるというエラーが表示されるため、プログラムをコンパイルできません。シャットダウンしてプロのように正規表現を許可するように指示するにはどうすればよいですか?
4 に答える
文字列を@
、で開始します。これにより、コンパイラは(ほぼ)すべての文字をエスケープせずにそのままにします(例外は"
、としてエスケープできます""
):
@"#(\d+(.\d+)?)=(\d+(.\d+)?"
\d
問題は、c#が文字列の内部を気に入らないことです。代わりに逐語的な文字列を使用してください
string pattern = @"#(\d+(.\d+)?)=(\d+(.\d+)?)";
「@」はそれを示します。C#は文字列内のエスケープシーケンスを検索しません。エスケープする必要がある場合は、"
2つ使用してください""
。
当然のことながら、通常の文字列を使用できます。ただし、バックスラッシュをエスケープする必要があります
string pattern = "#(\\d+(.\\d+)?)=(\\d+(.\\d+)?)";
通常の文字列を使用している場合は、次のように円記号をエスケープする必要があります。
"#(\\d+(.\\d+)?)=(\\d+(.\\d+)?)"
基本的に、C#にリテラル文字列を入れています。C#コンパイラは最初に文字列を確認\d
し、エスケープシーケンスとして解釈しようとします(これは存在しないため、エラーになります)。したがって、を使用\\d
して、C#コンパイラに文字列をとして表示させ、\d
それを正規表現エンジン(意味のあるものとして認識します)に渡します。(はい、正規表現パターンで文字通りの円記号を一致させたい場合は、を使用する必要があります)\d
\\\\
@
ただし、C#では、文字列の前に文字列を追加して、コンパイラに文字列をそのままにしておくという選択肢があります(ただし"
、エスケープする必要があります)。そのため、次のようになります。
@"#(\d+(.\d+)?)=(\d+(.\d+)?)"
逐語的な文字列リテラルを使用することもできます(読みやすさのためにこれらを使用することを好みます)。
使用する@"(#\d+(.\d+)?)=(\d+(.\d+)?)"
記号は、文字列が、終了に達するまで@"
エスケープ文字(接頭辞がaの文字)を解釈してはならないことを示します。\
"
"
注:代わりに二重引用符で囲むことにより、検索パターンの単一を一致させることができます""
。たとえば"Hello"
、パターンを使用して一致させることができます@"""\w+"""