1

文字列リテラルの次の仕様に一致する正規表現を書きたいと思います。この 10 時間、私はさまざまな正規表現を定式化することに夢中になりましたが、どれも機能していないようです。最後に、私はこれに煮詰めました:

  • ([^"]|(\\[.\n]))*\"

基本的に、要件は次のとおりです。

  1. 文字列リテラルは一致する必要があるため、最後の " まですべてを一致させます。その間に \" がある可能性がありますが、これは文字列を終了するべきではありません。
  2. 「\」を使用して \n を含むものをエスケープすることもできます。
  3. エスケープされていない '"' 文字のみが一致を終了できます。

正しく一致させる必要があるいくつかのサンプル文字列は次のとおりです。

  1. \a\b\"\n" => 次の文字 '\'、'a'、'\'、'b'、'\'、'"'、'\'、'n'、'" に一致する必要があります'
  2. \"this is still inside the string" => 最後の '"' を含むテキスト全体と一致する必要があります
  3. 'm about to escape to a newline \'\n'" => この文字列には \n 文字がありますが、文字列は先頭の 'm' から末尾の '"' まですべてに一致する必要があります。

このような正規表現を作成するのを手伝ってください。私の意見では、私が提供した正規表現は仕事をするべきですが、理由もなく失敗しています.

4

3 に答える 3

2

.正規表現はほぼ正しいです。文字クラス内では、ピリオドは単なるリテラルであり、 newline 以外の文字.ではないことに注意する必要があります。そう:

([^"\\]|\\(.|\n))*\"

または:

([^"\\]|\\[\s\S])*\"
于 2012-05-15T19:17:06.510 に答える
1

これはより効率的だと思います:

[^"\\]*(\\.[^"\\]*)*\"
于 2012-05-15T19:30:00.260 に答える
0

あなたの文字列も"で始まると思いました(あなたの例はそれで始まるべきではありませんか?)

Lookaround構造は、私が使用するのに最も自然なようです。

".*?"(?<!\\")

与えられた入力

"test" test2 "test \a test"  "test \"test" "test\"" 

これは一致します:

"test"
"test \a test"
"test \"test"
"test\""

正規表現は次のようになります。

Match the character “"” literally «"»
Match any single character that is not a line break character «.*?»
   Between zero and unlimited times, as few times as possible, expanding as needed (lazy) «*?»
Match the character “"” literally «"»
Assert that it is impossible to match the regex below with the match ending at this position (negative lookbehind) «(?<!\\")»
   Match the character “\” literally «\\»
   Match the character “"” literally «"»
于 2012-05-15T19:32:35.050 に答える