正規表現のマッチングを思い通りに――「境界アサーション」と「非貪欲な数量詞」ECMAScriptで学ぶ正規表現(5)

正規表現の基本と、ECMAScript(JavaScript)における利用方法を紹介する連載。今回は、マッチング位置を明示する境界アサーションと、最短マッチのための非貪欲な数量詞について。

» 2022年05月20日 05時00分 公開

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「ECMAScriptで学ぶ正規表現」のインデックス

連載:ECMAScriptで学ぶ正規表現

 本連載のサンプルコードをGitHubで公開しています。こちらからダウンロードしてみてください。具体的な利用方法は連載第1回を参考にしてください。

 正規表現を使っていくと、思い通りにマッチングしてくれない、ということがよくあります。その最たるものが、「マッチングはしたけど意図せず長くなってしまう」ことではないでしょうか? 今回は、マッチングする場所を明示する境界アサーションを紹介し、数量詞に「貪欲」「非貪欲」という区別があることも紹介しながら、思い通りにマッチングするための方法について模索していきます。

境界アサーション

 数量詞について深掘りする前に、数量詞を扱う上で重要になる「境界アサーション」について紹介しておきます。アサーション(assertion)とは、「主張」や「断言」といった意味ですが、この場合は「はっきりさせること」と捉えればよいでしょう。境界アサーションは、特定のパターンにマッチすることはなく、場所(境界)を明示するという意味です。

[NOTE]アサーション

 アサーションには、ここで紹介する境界アサーションの他に先読みアサーション、後読みアサーションなどがありますが、それらについては後続の回で取り上げる予定です。


先頭を明示するハット(^)

 ハット(^)は、文字列の先頭位置を明示します。ハット(^)が現れたら、それは必ず文字列の先頭になるので、後続のパターンは必ず先頭からマッチングが試みられます。つまり、先頭という境界を指定するのがハット(^)です。ハットの利用範囲は非常に広く、特に次に紹介するダラー($)と組み合わせると、文字列の全体に一致するパターンにすることができるので、フォームへの入力項目、ワークシート上のセルの値などのチェックに応用できます。

 以下の「assertion_hat.js」は、文字列先頭にある空白文字を全て削除します。

const regexp = /^\s+/;
const list = [
    ' こんにちは。',		// 行頭に全角の空白がある文字列
    '        Good Morning!',	// 行頭に半角の空白が複数ある文字列
    '\t1,000,000円'		// 行頭にタブ文字がある文字列
];
list.forEach((str, index) => {
    console.log(`${index}:${str.replace(regexp, '')}`);
});
assertion_hat.js

 こちらは、実行結果です。

0:こんにちは。
1:Good Morning!
2:1,000,000円

 空白文字は、文字クラスである\sで指定しています。半角スペース、全角スペース、タブ文字にマッチしていることがお分かりいただけると思います。この\sを後述するプラス(+)で繰り返し指定し、ハット(^)により先頭のみに制限し、マッチさせています。マッチ結果は、replace()メソッドで空文字列に置換すなわち削除しています。

[NOTE]否定としてのハット(^)

 ハット(^)は、文字集合([ ])の中で使われると、それは先頭という境界ではなく「それ以外」となる否定の意味になるので注意してください(第2回を参照)。


末尾を明示するダラー($)

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。