私がやりたいのは、引用符の間のすべてのテキストを取得することです。これらは両方とも適切に機能しているようです(rubyを使用)。これらの両方の機能に違いがあるのか 、それとも同じことを異なる方法で表現しているだけなのか、誰か教えてください.
編集:キュウリのステップ定義の二重引用符で囲まれたテキストを取得することを主に検討しています(その後、「Hello World」が表示されるはずです)。
複数の引用符で囲まれた文字列の場合、最初のものは同じデータを取得しない場合があります。入力データが次の場合
"hello" "world"
最初の式は文字列全体に一致しますが、2 番目の式は"hello"
部分のみに一致します。
一般に、バックトラッキングがないため、2 番目の式の方が高速です。この問題について詳しく説明している記事へのリンクを次に示します。
"(.*)"
- この正規表現は、一致に任意の記号を含めるよう指示する
ため、文字列の最初と最後の引用符の間のすべての記号に一致します。.*
"([^"]*)"
- この正規表現は、一致に
引用符を含めないように指示するため、文字列の最初と 2 番目の引用符の間のすべての記号に一致します。[^"]
正規表現チェックにはrubularをお勧めします。
うーん、そうではないはずです。(.*)
引用符が含まれていても何でも一致しますが、引用符を含まない([^"]*)
任意の数のシンボルを計算します。
それらは同じではありません。* 貪欲なので、"(.*)" が一致します。
foo "bar" baz "asd"
bar の前の引用符からずっと、asd を含めます。これはおそらくあなたが望むものではありません。2番目の例はそれを回避します。
それらは、.
任意の文字[^"]
に一致し、引用符を除くすべての文字に一致するという点で異なります。
それらの動作をより一貫さ"(.*?)"
せるには、最初の例を変更して、任意の文字のマッチングを非貪欲にすることができます (可能な限り短い文字列をキャプチャし、テキストの後半で別の終了引用符を見つけるリスクを回避します)。