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

肯定的な先読み: `(?=...)`

ポジティブ先読み (?=...) は ゼロ幅 アサーションです。 特定のパターンが現在の位置に従うかどうかをチェックしますが、** これらの文字を消費しない**。

Code
Pattern: \d+(?= euro)
Sample:  Prezzo 100 euro, sconto 25 euro, totale 75 dollari.
                ^^^                 ^^

先読み (?= euro) では、数字の後に euro が続く必要がありますが、 一致には数字のみが含まれます。 75 dollari は一致しません (euro は一致しません)。

なぜ「ゼロ幅」なのか

先読みは、位置に関する条件として考えてください。 試合の一部:

  • 先読みの前に一致が停止します。
  • 「一致後」の位置は、先読みによって検査されるテキストの開始位置です。
  • g フラグを使用した次の一致試行はそこから再開されます。

これにより、コンテキストなしで値を抽出するのに最適になります: 価格 通貨や句読点の前の単語などは含まれません。

先読み機能とゼロ幅スキャン

肯定的な先読み (?=...) は、指定されたパターンが現在のポイントに従うことを保証しますが、スキャンは先読みの前の位置から再開されます。これにより、後続の一致に必要となる可能性のあるテキストの部分を「消費」することがなくなります。

試してみてください

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

ユーロ価格の数字 (「ユーロ」が続く数字のシーケンス) のみを抽出します。試合に通貨はありません。

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

' euro' を先読み (?= euro) 内に移動します。文字列は一致の一部になりません。

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

復習演習

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

直後にコロン「:」が続くすべての単語を検索します (ただし、一致にはコロンは含まれません)。

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

同じロジックです。「:」は一致には含まれませんが、位置条件です。

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

追加の課題

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

Find every word (e.g. function name) followed immediately by an open parenthesis `(`, excluding the parenthesis from the match.

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

\\( (エスケープされた開き括弧) を正の先読み (?=...) 内に移動します。

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