Regular Expressions
正規表現の落とし穴
サーチ…
改行文字( "\ n")とドット(。)が一致しないのはなぜですか?
.*
正規表現では基本的に "入力の終わりまですべてをキャッチする"という意味です。
ですから、 hello world
ような単純な文字列の場合、 .*
は完全に動作します。しかし、例えばファイル内の行を表す文字列があれば、これらの行はUnixライクなシステムでは\n
(改行)、on-likeシステムでは\r\n
(改行と改行)などの行区切りで区切られます。 Windows。
デフォルトでは、ほとんどの正規表現エンジンでは、 .
改行文字と一致しないので、各論理行の最後で一致が停止します。あなたが欲しいならば.
改行を含む実際のすべてと一致させるには、正規表現のエンジンで「ドットマッチオール」モードを有効にする必要があります(たとえば、Pythonではre.DOTALL
フラグ、PCREでは/s
を追加します)。
なぜ正規表現はいくつかのかっこ/括弧をスキップして後で一致させるのでしょうか?
この例を考えてみましょう。
彼はカフェ「ドストエフスキー」に行って、「おはよう」と言った。
ここでは2つの引用符があります。正規表現が"Dostoevski"
と "Good evening."
"Dostoevski"
一致するように、両方を一致させたいと仮定しましょう"Good evening."
最初は、単純にしておきたいと思うかもしれません。
".*" # matches a quote, then any characters until the next quote
しかし、それは動作しません:それは、最初の見積もりから一致する"Dostoevski"
とで終了引用符まで "Good evening."
、を含むand said:
部分。 Regex101デモ
なぜそれが起こったのですか?
これは、遭遇した場合、正規表現エンジンので起こる.*
非常に最後まで入力のすべてを「食べます」。その後、それが最終的に一致する必要が"
だから、それは『』最初までマッチしたテキストを手放す、試合終了からバックオフを"
発見された-そしてそれは、当然のことながら、最後である"
試合で"Good evening."
の終わりに。
これを防止し、最初の引用符と正確に一致させるにはどうすればよいですか?
使用する[^"]*
これは、すべての入力を食べていません。 -最初まで"
、必要に応じて同じように。 Regex101デモ