21

これは、正規表現構文の形式化に関する議論から生じました。いくつかの正規表現パーサーでこの動作を確認したため、言語に依存しないタグを付けました。

次の式を取ります (好みの言語に合わせて調整してください)。

replace("input", "(.*)*", "$1")

空の文字列を返します。なんで?

さらに興味深いことに、この式replace("input", "(.*)*", "A$1B")は string を返しますABAB。なぜダブル空の試合なのですか?

免責事項:バックトラックと貪欲な一致については知っていますが、Jeffrey Friedl.*によって作成されたルールでは、すべてに一致し、それ以上のバックトラックや一致は行われないことが規定されているようです。では、なぜ$1空なのですか?

注:(.+)*入力文字列を返すと比較してください。ただし、http://regexhero.comは、まだ 2 つの一致があることを示しています。これは、上記と同じ理由で奇妙に思えます。

4

1 に答える 1

25

しばらく様子を見てみましょう:

  1. (.*)一致し"input"ます。
  2. "input"グループ にキャプチャされ1ます。
  3. 正規表現エンジンが文字列の末尾に配置されるようになりました。しかし、(.*)が繰り返されるため、別の一致試行が行われます。
  4. (.*)の後の空の文字列に一致します"input"
  5. 空の文字列は group に取り込まれ1、上書きされます"input"
  6. $1空の文字列が含まれるようになりました。

コメントからの良い質問:

では、なぜ をreplace("input", "(input)*", "A$1B")返すの"AinputBAB"ですか?

  1. (input)*一致し"input"ます。に置き換えられ"AinputB"ます。
  2. (input)*空の文字列に一致します。"AB"($1マッチに参加しなかったので空です) に置き換えられます。
  3. 結果:"AinputBAB"
于 2013-01-24T11:27:23.460 に答える