JavaScriptの正規表現でlookahead・lookbehindを使う応用例
生徒
「JavaScriptの正規表現で前後の条件を考慮して文字列を検索することはできますか?」
先生
「できます。lookahead(先読み)やlookbehind(後読み)を使うと、特定の文字列の前後の条件をチェックしながらマッチさせることができます。」
生徒
「先読みや後読みって少し難しそうです。具体的にはどういうことですか?」
先生
「簡単に言うと、ある文字列の後ろや前に特定の条件がある場合だけマッチさせたいときに使います。文字自体はマッチ結果に含めずに条件として使えるのが特徴です。」
1. lookaheadとは?
lookahead(先読み)は、文字列の後に特定のパターンが続く場合にだけマッチさせる方法です。正規表現では (?=…) と書きます。
const text = "apple pie, apple tart, banana pie";
const regex = /apple(?= pie)/g;
const result = text.match(regex);
console.log(result); // ["apple", "apple"]
この例では、「apple」の後に「pie」が続く場合だけマッチします。「apple tart」にはマッチしません。
2. lookbehindとは?
lookbehind(後読み)は、文字列の前に特定のパターンがある場合だけマッチさせる方法です。正規表現では (?<=…) と書きます。
const text = "apple pie, banana pie";
const regex = /(?<=banana )pie/g;
const result = text.match(regex);
console.log(result); // ["pie"]
この例では、「banana 」の後に続く「pie」のみマッチします。「apple pie」はマッチしません。
3. 否定のlookahead・lookbehind
特定の文字列が前後にない場合だけマッチさせたいときもあります。否定の先読みは (?!…)、否定の後読みは (?<!…) です。
const text = "apple pie, apple tart";
const regex = /apple(?! pie)/g;
const result = text.match(regex);
console.log(result); // ["apple"]
この例では、「apple」の後に「pie」が続かない場合のみマッチします。「apple pie」は無視され、「apple tart」がマッチします。
4. 実用例: 文字列置換で応用
lookahead・lookbehindを使うと、置換や抽出でより精密な操作が可能です。例えば、単語の前後の条件によって置換する場合です。
const text = "I have a cat and a dog.";
// "a " の後に "cat" が続く場合だけ "cat" を "kitten" に置換
const newText = text.replace(/(?<=a )cat/g, "kitten");
console.log(newText); // "I have a kitten and a dog."
このように、特定の条件に基づいた文字列操作ができるのがlookahead・lookbehindの魅力です。
5. lookahead・lookbehindを使うポイント
- 文字列自体はマッチ結果に含めずに条件として使える
- 前後の条件を考慮した検索や置換に便利
- 否定条件も使えるので除外したい場合にも対応可能
- 初心者はまず簡単な例で慣れることが大切
正規表現は最初難しく感じますが、lookahead・lookbehindを覚えると文字列操作の幅が大きく広がります。