メインコンテンツにスキップ
モジュール 2 · レッスン 3 / 4コース内の 7/32~10 min
モジュールのレッスン (3/4)

貪欲 vs 怠け者

デフォルトでは、数量指定子は 貪欲です。可能な限り多くの量を消費します。 パターンを有効に保ちながら。量指定子の後に ? を追加する (*?、+?、 ??、{n,m}?) は 遅延 バージョンを提供します。消費量は最小限です。 可能です。

Code
Sample: <b>uno</b> e <i>due</i>

Greedy pattern  <.*>     matches:  <b>uno</b> e <i>due</i>   (everything)
Lazy pattern    <.*?>    matches:  <b>           </b>
                                   <i>           </i>        (4 matches with the g flag)

まったく同じパターンですが、1 文字だけ異なります (? が 量指定子)、まったく異なる結果になります。

大事なとき

  • 区切り文字間のコンテンツ (HTML タグ、引用符、 括弧内) lazy バージョンがほとんどの場合正しいものです。
  • 行末までを一致させるには、通常、greedy (.*) が必要です。

エンジンにおける貪欲な戦略と怠惰な戦略

貪欲な量指定子は可能な限り多くのテキストを消費し、強制された場合にのみバックトラックします。 ? (lazy) を追加すると、エンジンは絶対最小値を消費し、パターンの次の一致を検索するために一度に 1 文字ずつ進みます。

試してみてください

運動#regex.m2.l3.e1
試行回数: 0読み込み中…

遅延バージョン `.*?` を使用して、サンプルからすべての HTML タグ (例: `<b>`、`</b>`、`<i>`、`</i>`) を抽出します。

エディターを読み込み中…
ヒントを表示

Greedy <.*> は、最初のタグの先頭から最後のタグの末尾まで一致します。遅延 <.*?> は、最初に遭遇したところで停止します。

3 回の試行後に解決策が利用可能になります

復習演習

運動#regex.m2.l3.e2
試行回数: 0読み込み中…

テキスト内の二重引用符で囲まれたすべての文字列を抽出します (例: "ciao"、"mondo")。後の終了へのジャンプを避けるために、量指定子の遅延バージョンを使用してください。

エディターを読み込み中…
ヒントを表示

「.*?」最初の閉じ二重引用符で停止します。

3 回の試行後に解決策が利用可能になります

追加の課題

運動#regex.m2.l3.e3
試行回数: 0読み込み中…

Extract all text blocks enclosed in square brackets (e.g. `[text]`), including the brackets, using a lazy quantifier so as not to merge separate blocks.

エディターを読み込み中…
ヒントを表示

開き括弧には \\[ を使用し、次に .*?最後に \\] は閉じ括弧です。

3 回の試行後に解決策が利用可能になります