JavaScriptにはmatchという関数(メソッド)があり、正規表現を使って、主に次の二つのことができます。
- 文字列が条件に合致しているかどうかを判定。
- 条件に合致した文字列を抽出。
これを利用して文字列から郵便番号を抽出してみます。
郵便番号は「163-8019」のような文字列です。
「半角数字3文字」+「半角ハイフン」+「半角数字4文字」であるとします。
これを正規表現で表わすと「\d{3}-\d{4}」となります。
「\d」は半角数字を表します。「{n}」はn文字を表します。「\d{3}」で半角数字3文字を表します。
条件に合致した文字列を抽出するには次のようにします。
「macth(/正規表現/フラグ)」のように使います。フラグに「g」を指定すると合致する文字列を全て抽出し、配列で返します。
一般的にはこれで大丈夫なのですが、実際に使ってみると色々と不具合が起きます。
元のテキスト
次の文字列から郵便番号を抽出します。
002-1234
〒003-1234
郵便番号は004-1234です。
00-0005-1234
00006-12345
007-1234
期待されるのは1,2,3,4,7番目です。
5番目は電話番号風、6番目は何らかのコードですので、これらは不要です。
通常
正規表現を「\d{3}-\d{4}」とした場合です。
結果は次の通りです。
002-1234
003-1234
004-1234
005-1234
006-1234
007-1234
5番目と6番目も抽出してしまいました。
前後が数値でない
郵便番号の前後が半角数字でないケースのみを抽出することにします。
正規表現を「\D\d{3}-\d{4}\D」とします。「\D」と大文字にすると半角数値以外となります。
〒003-1234
は004-1234で
文字列の先頭である1番目と末尾である7番目が漏れてしまいました。
前後が数値でない、または先頭・末尾である
さらに先頭と末尾のケースを抽出することにします。
正規表現を「(^|\D)\d{3}-\d{4}($|\D)」とします。「^」は文字列全体の先頭、「$」は文字列全体の末尾を表します。
002-1234
〒003-1234
は004-1234で
007-1234
一応、期待するケースが抽出できましたが、余計な文字が付いてしまいました。
前後を削除
実はmatchには括弧で挟んだ部分だけを抽出する機能があるので余計な文字を省くことができます。しかしフラグ「g」を使うとその機能が使えなくなります。
そこで配列に取り込んだ文字列に対して、それぞれreplaceを使い、必要な部分だけを抽出します。
for(i = 0; i < matches.length; i ++){
matches[i] = matches[i].replace(/\D?(\d{3}-\d{4})\D?/, "$1");
}
括弧で挟んだ部分「(\d{3}-\d{4})」は「$1」で取り出せます。
「は004-1234で」を「004-1234」に置換するという感じです。
002-1234
003-1234
004-1234
007-1234
コメント
[…] 「JavaScriptの正規表現で該当文字列を全て抽出」について考えました。 matchで抽出した文字列に対しreplaceで無駄な部分を省く方法を使いました。 フラグ「g」を使うと必要な部分だけを抽出することができないからです。 しかし二度手間なのでスマートではありません。 […]