モジュールのレッスン (1/4)
肯定的な先読み: `(?=...)`
ポジティブ先読み (?=...) は ゼロ幅 アサーションです。
特定のパターンが現在の位置に従うかどうかをチェックしますが、**
これらの文字を消費しない**。
Pattern: \d+(?= euro)
Sample: Prezzo 100 euro, sconto 25 euro, totale 75 dollari.
^^^ ^^先読み (?= euro) では、数字の後に euro が続く必要がありますが、
一致には数字のみが含まれます。 75 dollari は一致しません (euro は一致しません)。
なぜ「ゼロ幅」なのか
先読みは、位置に関する条件として考えてください。 試合の一部:
- 先読みの前に一致が停止します。
- 「一致後」の位置は、先読みによって検査されるテキストの開始位置です。
gフラグを使用した次の一致試行はそこから再開されます。
これにより、コンテキストなしで値を抽出するのに最適になります: 価格 通貨や句読点の前の単語などは含まれません。
先読み機能とゼロ幅スキャン
肯定的な先読み (?=...) は、指定されたパターンが現在のポイントに従うことを保証しますが、スキャンは先読みの前の位置から再開されます。これにより、後続の一致に必要となる可能性のあるテキストの部分を「消費」することがなくなります。
試してみてください
ユーロ価格の数字 (「ユーロ」が続く数字のシーケンス) のみを抽出します。試合に通貨はありません。
ヒントを表示
' euro' を先読み (?= euro) 内に移動します。文字列は一致の一部になりません。
3 回の試行後に解決策が利用可能になります
復習演習
直後にコロン「:」が続くすべての単語を検索します (ただし、一致にはコロンは含まれません)。
ヒントを表示
同じロジックです。「:」は一致には含まれませんが、位置条件です。
3 回の試行後に解決策が利用可能になります
追加の課題
Find every word (e.g. function name) followed immediately by an open parenthesis `(`, excluding the parenthesis from the match.
ヒントを表示
\\( (エスケープされた開き括弧) を正の先読み (?=...) 内に移動します。
3 回の試行後に解決策が利用可能になります