1

重複の可能性:
正規表現の疑問符

括弧内のテキストを解析する方法を理解しようとしていますが、ステートメント内の一重引用符の間にあります。たとえば、次のステートメントがあるとします。

(I have a 'cat', 'hat');

私は結果が欲しい

cat
hat

ウィキペディア ( http://en.wikipedia.org/wiki/Regular_expression )で定義されているさまざまなメタ文字を試してみることでなんとか理解できましたが、なぜそれが機能するのかを理解するのにまだ苦労しています。

私はこれを試しました:\'(.*)\'

この正規表現の私の理解: 一重引用符の間の文字を取得したいのですが、'これらの文字は任意の単一文字と.0 回以上一致します*

これにより、次の結果が得られました。

cat', 'hat

たくさんの正規表現で遊んだ後、私は最終的に偶然これに行き着きました:\'(.*?)\'

これにより、次の結果が得られました。

cat
hat

なぜこれが機能するのですか?(特に、「?」の仕組みがわかりません。)

4

4 に答える 4

2

文字列内で可能な限り長い一致を作成する正規表現のデフォルトの動作。これは「貪欲」と呼ばれます。

?通常は直前の項目 (文字など) に 1 回以上一致することを意味しますが、これは*?正規表現エバリュエーターを「レイジー」モードに切り替える「レイジー スター」と呼ばれる特殊なケースです。このモードでは、エバリュエーターは最初に前の項目をスキップしようとします (そして、それなしで一致を完了します)、その後、その項目に「戻ります」。

最終的な結果は、あなたが観察したとおりです。(デフォルト) の代わりに検索基準を満たす短い文字列に一致し、可能な限り最長の一致を見つけるだけです。

正規表現をテストするための便利なリソースはこちらで、レイジー スターを含むさまざまなオプションの説明はこちらです。

于 2012-06-25T22:03:02.190 に答える
2

デフォルトでは、正規表現は貪欲です。疑問符を使用することで、マッチを「レイジー」モードに変更します。これは、可能な最小文字数に一致することを意味します。

于 2012-06-25T21:52:18.117 に答える
1

これは次の理由で機能します。

()は結果をグループ化するものです (これは戻り値として取得したいものです)。

. 何にでも合います。

*一致を 0 回以上表示させます。

? はオプションなので、ab? aまたはabの場合です。

最後に、(.*?)1 回だけ ( ?working) またはすべての 0 回以上( working) 以外のすべてに一致します*

于 2012-06-25T21:57:24.817 に答える
0

* の後に ? が続く場合 これにより、遅延モードで * が一致します。デフォルトでは貪欲に動作します。一致する文字を可能な限り吸い上げます。レイジー モードでは、パターンの残りの部分をできるだけ早く続行しようとします。

そもそも道を間違えた。修正しました。

于 2012-06-25T21:50:53.960 に答える