4

次の形式の文字列があります。

prm.Add( "blah", "blah" ); 

正規表現を使用して最初の「何とか」を抽出しようとしています。これを行うために、私は前半分を切り取り、次に後半を切り分けています。

「prm.Add(」を取り除くために使用している正規表現は次のとおりです。

"prm.Add\([ ]*"

他のスレッドは、paranthesisの前のエスケープ文字が受け入れられることを示しているようです。ただし、VSは、無効なエスケープ文字シーケンス "("があると文句を言います。使用する場合:

"prm.Add([ ]*" 

クロージングパランセシスがないため、アプリケーションエラーが発生します。

「prm.Add(」でRegex.Escapeを使用することでこれを回避できることに気付きましたが、これはあまりエレガントではありません。

正規表現の構文が間違っていますか、またはVS2010は角かっこのエスケープを受け入れませんか?

4

3 に答える 3

9

コンパイラが理解するには、バックスラッシュもエスケープする必要があります。"prm.Add\\([ ]*"または@"prm.Add\([ ]*"

そうでなければ、コンパイラは次のようなことを理解できませんでした"\n"-作者は何を望んでいますか?改行または文字列「\n」はそのままですか?

しかし、私はそれをより動的にしようとします。たとえば、スペース文字がそこにあるとは想定していません。

于 2012-07-31T14:53:37.153 に答える
4

パターン(文字列)でエスケープするときは、2つのエスケープシーケンスを使用する必要があります。

"prm.Add\\([ ]*"

これは、エスケープを1つだけ使用すると、システムは、と評価される文字を見つけようとするためです。この文字\(は存在しません。確かに知っている他の文字は、eg\rまたは\nです。

したがって、2つを使用することにより\、実際には-をエスケープして、\解釈されるパターンのままにします。そして、そのパターンの中で、あなたは正規表現をエスケープします-の意味(

于 2012-07-31T14:54:54.117 に答える
0

ここでの問題は、IDEで文字列をエスケープするときに、コンパイラがエスケープを理解できるように何かをエスケープしていることです。必要なのは、REGEXオブジェクトが文字列を理解することです。

を取得するには、正規表現オブジェクトが必要ですprm.Add\([ ]*

ただし、バックラッシュ(\)はエスケープ文字であるため、コンパイラは "("をエスケープしようとしますが、方法がわかりません。したがって、バックラッシュ自体をエスケープする必要があります。

prm.Add\\([ ]*

コンパイラはこの文字列を処理し、に変換\\\ます。正規表現は。によって形成される文字列を取得するため、これはあなたが望むものにつながりますprm.Add\([ ]*

これを理解する1つの方法は、ファイルまたはユーザー入力から正規表現を読み取っている場合、コンパイラがそれを処理しなくなったため、必要なバックラッシュは1つだけであるということです(文字列は実行時に取得されますが、コンパイル時にハードコーディングする)。

于 2012-07-31T14:57:45.130 に答える