モジュールのレッスン (3/4)
貪欲 vs 怠け者
デフォルトでは、数量指定子は 貪欲です。可能な限り多くの量を消費します。
パターンを有効に保ちながら。量指定子の後に ? を追加する (*?、+?、
??、{n,m}?) は 遅延 バージョンを提供します。消費量は最小限です。
可能です。
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 文字ずつ進みます。
試してみてください
遅延バージョン `.*?` を使用して、サンプルからすべての HTML タグ (例: `<b>`、`</b>`、`<i>`、`</i>`) を抽出します。
ヒントを表示
Greedy <.*> は、最初のタグの先頭から最後のタグの末尾まで一致します。遅延 <.*?> は、最初に遭遇したところで停止します。
3 回の試行後に解決策が利用可能になります
復習演習
テキスト内の二重引用符で囲まれたすべての文字列を抽出します (例: "ciao"、"mondo")。後の終了へのジャンプを避けるために、量指定子の遅延バージョンを使用してください。
ヒントを表示
「.*?」最初の閉じ二重引用符で停止します。
3 回の試行後に解決策が利用可能になります
追加の課題
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 回の試行後に解決策が利用可能になります