正規表現のマッチングを思い通りに――「境界アサーション」と「非貪欲な数量詞」:ECMAScriptで学ぶ正規表現(5)
正規表現の基本と、ECMAScript(JavaScript)における利用方法を紹介する連載。今回は、マッチング位置を明示する境界アサーションと、最短マッチのための非貪欲な数量詞について。
正規表現を使っていくと、思い通りにマッチングしてくれない、ということがよくあります。その最たるものが、「マッチングはしたけど意図せず長くなってしまう」ことではないでしょうか? 今回は、マッチングする場所を明示する境界アサーションを紹介し、数量詞に「貪欲」「非貪欲」という区別があることも紹介しながら、思い通りにマッチングするための方法について模索していきます。
境界アサーション
数量詞について深掘りする前に、数量詞を扱う上で重要になる「境界アサーション」について紹介しておきます。アサーション(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, '')}`); });
こちらは、実行結果です。
0:こんにちは。 1:Good Morning! 2:1,000,000円
空白文字は、文字クラスである\sで指定しています。半角スペース、全角スペース、タブ文字にマッチしていることがお分かりいただけると思います。この\sを後述するプラス(+)で繰り返し指定し、ハット(^)により先頭のみに制限し、マッチさせています。マッチ結果は、replace()メソッドで空文字列に置換すなわち削除しています。
末尾を明示するダラー($)
Copyright © ITmedia, Inc. All Rights Reserved.