0

入力文字列は

@"SomeCall(Resource.T(""String )))1""), ""String 2"", ""String 3"");"

"String 2"と のみを取得したい"String 3"*しかし ではありません "String )))1"

私はこの表現を使用します:

 (?<!Resource\.T)("(?:\.|[^\"])*")

私が間違っていることは何ですか?

アップデート。かわった

(?<!Resource\.T) 

(?<!Resource\.T\()

、しかし結果は

"), ", ", "

今のところ :)

4

5 に答える 5

3

後読みが正しくないため、機能しません。次のように変更します。

 (?<!Resource\.T\()

の直前では、 だけでなく、前"がないかどうかを確認する必要があります。Resource.T(Resource.T

編集:
わかりました。問題を解決するために"、試合後に のペア番号があるかどうかを確認します。

(?<!Resource\.T\()("(?:\.|[^\"])*")(?=(?:[^"]|"[^"]*")*$)

そのため、別の文字列があるかどうかを文字列の最後までチェックし、ある"場合は、2 番目の文字列があることを確認します。
私はそれが最も一般的な方法だと思います (パフォーマンス指向の最良の方法ではないかもしれません)。

于 2013-04-12T12:17:40.137 に答える
0

ロームフーフが言ったように、否定後読みに「(」を追加する必要があります。しかし、ご覧のとおり、最初の一致は、文字列 1 の終了引用符と文字列 2 の開始引用符が一致したものです。文字列が勝ったことがわかっている場合コンマが含まれていない場合は、コンマを除外して一致させることができます:

(?<!Resource\.T\()("[^,"]*")
于 2013-04-12T12:23:43.683 に答える
0
(?<!Resource\.T)("(?:\.|[^\")])*")
于 2013-04-12T12:07:35.210 に答える