column

ITコラム

mv7762

プログラミングノウハウ

2017.11.15

JavaScript【match】文字列のマッチと正規表現

String オブジェクトのmatch メソッドは、条件にマッチする文字列を検索するメソッドです。
今回は、match メソッドの使い方と正規表現について紹介します。

なお、未経験からITエンジニアへの就職に興味がある方や未経験からプログラミングを効率よく学びたいと考えている方は、就職率98.3%で受講料無料のプログラミングスクールプログラマカレッジもおすすめです。

1. match メソッド

 
String オブジェクトのmatch メソッドは、指定した検索条件にマッチする文字列を、配列にして返すメソッドです。

match メソッドは、次のように使用します。

文字列.match( 検索条件 );

検索条件は、正規表現で指定します。
正規表現以外で指定した場合は、暗黙的に正規表現への変換が行われます。

指定した検索条件にマッチする文字列がある場合は、マッチした文字列を要素とする配列が返ります。

指定した検索条件にマッチする文字列が
なかった場合は、null が返ります。

match メソッドを使用して、文字列を検索してみます。

let str = "ABCDEFGabcdefghijklmn";
str.match(/[A-E]/gi);

正規表現は、スラッシュ「 / 」で囲んで記述します。

「 [A-E] 」は、アルファベットで A から E まで中の1文字 を表します。

スラッシュ「 / 」の後に記述された 「 g 」と「 i 」は、検索パターンのオプション値で、「 g 」は マッチしたものをすべて返す、「 i 」は 大文字と小文字を区別しない、という内容です。

正規表現については、次章で詳しく紹介します。
 

「 str.match(/[A-E]/gi); 」を出力すると、次のように表示されます。

str = “ABCDEFGabcdefghijklmn”
 
 

 
配列データとして分かりやすく表示するために、「 JSON.stringify(str.match(/[A-E]/gi)); 」でJSON文字列に変換して表示しています。
(JSON.stringifyメソッドやJSON文字列については、JSON文字列に変換して比較をご参照下さい。)

▲目次へ戻る

2. 正規表現

 

正規表現の記述方法

 
正規表現は、次のように 2 種類の方法で記述します。

let 変数 = / 正規表現のパターン / オプション;
let 変数 = new RegExp("正規表現のパターン", "オプション"); 

上のサンプルは、スラッシュ( / )で囲まれたパターンからなる正規表現リテラルを使用して、正規表現を記述しています。

下のサンプルは、RegExp オブジェクトのコンストラクタ関数を呼び出して 正規表現を記述しています。

正規表現パターンが変わる可能性がある場合や、パターンが不明の場合等は、下のサンプルの記述方法が、正規表現が不変の場合は 上のサンプルの記述方法が、それぞれ良いパフォーマンスに繋がります。
 
 

単純なパターン

 
「 /abc/ 」というパターンは、「 abc 」 という文字が 一緒にその順番で存在している時のみ、文字列中の文字の組み合せにマッチします。
このように、直接マッチしている部分を見つけたい文字から構成された正規表現を、単純なパターンと呼びます。
 
 

特殊文字

 
1 個以上の a を検索したり、空白文字の検索 等、より高度な検索をする場合は、パターンに特殊文字を使用します。

例えば「 /ab*c/ 」というパターンでは、1 個の「 a 」とその後ろに続く 0 個以上の「 b 」( * は直前のアイテムの 0 回以上の出現を意味します )、そしてその後ろに続く「 c 」で構成される文字の組み合わせにマッチします。
「 cbbabbbbcdebc 」という文字列を、「 /ab*c/ 」というパターンで検索すると、「 abbbbc 」という部分文字列が条件にマッチします。

特殊文字の種類については、最後に一覧表示しています。
 
 

主なパターン

 
正規表現では、主に次のようなパターンを使用します。
(下記にない特殊文字については、特殊文字一覧をご参照下さい。)

パターン 内容
ABCD ABCDという文字列
[ABCD] A,B,C,Dのどれかひとつ
[^ABCD] A,B,C,D以外
[A-D] A,B,C,Dのどれかひとつ
^A 先頭がA
A$ 最後尾がA
A{n} Aがn回続いている
A{n,} Aがn回以上続いている
A+ Aが1回以上続いている(A{1,} と同じ)
\ \の次の文字をエスケープする

 
 

オプションフラグ

 
正規表現で使用するオプションフラグには、以下のようなものがあります。

フラグ 内容
g マッチしたものをすべて返す(グローバルサーチ)
i 大文字と小文字とを区別しない
m 複数行検索
y 対象文字列で最後に見つかったマッチの位置から検索を開始する先頭固定検索を行う

 
 

特殊文字一覧

 
正規表現における特殊文字は、以下の種類があります。

特殊文字 内容
\ 以下のルールに基づいてマッチする
・特別な意味を持たない文字の前に付けられたバックスラッシュは、次の文字が特別なもので、文字通りには評価されないことを表す
例えば、?b?は文字列中にある小文字の ‘b’ にマッチするが、?\b?は、どんな文字にもマッチしない 単語区切り文字を意味する特殊文字となる
・特別な意味を持つ文字の前に付けられたバックスラッシュは、次の文字が特別なものでなく、文字通りに評価されることを表す
例えば、パターン?/a*/?は特殊文字 ‘*’ の働きによって 0 個以上の a にマッチするが、パターン?/a\*/?は ‘*’ の特殊性が削除され、’a*’ と行った文字列のマッチが可能となる
^ 入力の先頭にマッチする
複数行フラグが true にセットされている場合は、改行文字の直後にもマッチする
例えば?/^A/?は “an A” の ‘A’ にはマッチしないが、”An E” の ‘A’ にはマッチする
この文字は、文字集合パターンの先頭にある場合は異なる意味を持つ
$ 入力の末尾にマッチする
複数行フラグが true にセットされている場合は、改行文字の直前にもマッチする
例えば?/t$/?は “eater” の ‘t’ にはマッチしないが、”eat” の ‘t’ にはマッチする
* 直前の文字の 0 回以上の繰り返しにマッチする
{0,}?に相当
例えば?/bo*/?は “A ghost booooed” の ‘boooo’ や “A bird warbled” の ‘b’ にマッチするが、”A goat grunted” ではマッチししない
+ 直前の文字の 1 回以上の繰り返しにマッチする
{1,}?に相当
例えば?/a+/?は “candy” の ‘a’ や “caaaaaaandy” のすべての a にマッチする
? 直前の文字の 0 回か 1 回の出現にマッチする
{0,1}?に相当
例えば?/e?le?/?は “angel” の ‘el’ や “angle” の ‘le’、または “oslo” の ‘l’ にマッチする
*、+、?、{}?といった量指定子の直後に使用した場合、その量指定子をデフォルトとは逆の非貪欲 (non-greedy)(最短)マッチにする(デフォルトは欲張り (greedy)(最長)マッチ)
例えば /\d+/ は非グローバルマッチで “123abc” の “123” にマッチするが、/\d+?/ の場合は “1” だけにマッチする
この特殊文字は、この表の x(?=y) および x(?!y) の項目で出てくる先読みアサーションでも使用できる
. 改行文字以外のどの 1 文字にもマッチする
例えば?/.n/?は “nay, an apple is on the tree” の ‘an’ や ‘on’ にはマッチするが、’nay’ にはマッチしない
(x) ‘x’ にマッチし、マッチした内容を記憶する
このカッコは キャプチャリング(格納)カッコと呼ばれる
例えば、パターン?/(foo) (bar) \1 \2/?内の ‘(foo)’ と ‘(bar)’ は、文字列 “foo bar foo bar” の最初の 2 個の単語にマッチし、それを記憶する
パターン内の?\1?と?\2?は文字列の最後の 2 個の単語にマッチする
\1, \2, \n?は正規表現のマッチ部分で使用することに注意
置換部分で使用する際は?$1, $2, $n?とする必要がある(例えば?’bar foo’.replace( /(…) (…)/, ‘$2 $1’ )?)
(?:x) ‘x’ にマッチするが、マッチした内容は記憶しない
このカッコは非キャプチャリング(非格納)カッコと呼ばれ、パターンをグルーピングして、正規表現演算子と一緒に使う際の部分正規表現式を定義することができる
式?/(?:foo){1,2}/?を見てみると、式が?/foo{1,2}/?であれば、{1,2}?の文字は ‘foo’ の最後の ‘o’ にのみ適用される
非キャプチャリング括弧を使うと、{1,2}?は ‘foo’ という単語全体に適用される
x(?=y) ‘x’ に ‘y’ が続く場合のみ ‘x’ にマッチする
この特殊文字は先読みと呼ばれる
例えば?/Jack(?=Sprat)/?は ‘Jack’ の後に ‘Sprat’ が続く場合のみ ‘Jack’ にマッチする
/Jack(?=Sprat|Frost)/?は ‘Jack’ の後ろに ‘Sprat’ または ‘Frost’ が続く場合のみ ‘Jack’ にマッチするが、’Sprat’ も ‘Frost’ もマッチの結果には表れない
x(?!y) ‘x’ に ‘y’ が続かない場合のみ ‘x’ にマッチする
この特殊文字は否定先読みと呼ばれる
例えば?/\d+(?!\.)/?は後ろに小数点が続かない数値にマッチする
正規表現?/\d+(?!\.)/.exec(“3.141”)?は ‘141’ にマッチするが ‘3.141’ にはマッチしない
x|y ‘x’ または ‘y’ にマッチする
例えば?/green|red/?は “green apple” の ‘green’ や “red apple” の ‘red’ にマッチする
{n} 直前の文字がちょうど?n?回出現するものにマッチする
n?には正の整数が入る
例えば?/a{2}/?は “candy” の ‘a’ にはマッチしないが、”caaandy” の最初の 2 個の a にはマッチする
{n,m} 直前の文字が少なくとも?n?回、多くても?m?回出現するものにマッチする
n?および?m?には正の整数が入る
m?を省略した場合は?∞ とみなされる
例えば?/a{1,3}/?は “cndy” ではマッチせず、”candy,” の ‘a’、”caandy,” の 最初の 2 個の a、”caaaaaaandy” の最初の 3 個の a にマッチする
“caaaaaaandy” では元の文字列に a が 4 個以上あるが、マッチするのは “aaa” であることに注意
[xyz] 文字集合を表す
このパターンでは、角カッコで囲まれた文字のいずれか 1 個にマッチする
対象の文字はエスケープシーケンスも含む
文字の集合内では、特殊文字 (例えばドット (.) やアスタリスク (*)) は特別な意味を持たないので、それらにエスケープは不要
ハイフンを用いて文字の範囲を指定することも可能
例えば?[abcd]?は?[a-d]?と同じで、”brisket” の ‘b’ や “city” の ‘c’ にマッチする
/[a-z.]+/?および?/[\w.]+/?はどちらも、”test.i.ng” の全体にマッチする
[^xyz] 文字集合の否定または補集合
角カッコで囲まれた文字ではない文字にマッチする
ハイフンを用いて文字の範囲を指定することも可能
文字集合パターンで動作するものすべてがこちらでも機能する
例えば?[^abc]?は?[^a-c]?と同じで、”brisket” の ‘r’ や “chop” の ‘h’ のような一番最初の該当文字にマッチする
[\b] 後退文字(バックスペース、U+0008)にマッチする
後退文字自体にマッチさせるには角カッコを使う必要がある(\b?と混同しないように注意)
\b 単語の区切りにマッチする
単語の区切りは、単語構成文字の前または後ろに別の単語構成文字がない位置にマッチする
マッチした単語の区切りは、マッチした部分に含まれないことに注意
マッチした単語の区切りの長さは 0 ( [\b]?と混同しないように注意 )
例:
/\bm/?は “moon” の ‘m’ にマッチする
/oo\b/?は “moon” の ‘oo’ にはマッチしない( ‘oo’ の後ろに単語構成文字である ‘n’ が続いているため )
/oon\b/?は “moon” の ‘oon’ にマッチする( ‘oon’ が文字列の終端であり単語構成文字が続かないため )
/\w\b\w/?はどこにもマッチしない( 単語構成文字の後に非単語構成文字および単語構成文字を続けることができないため )
\B 単語の区切り以外の文字にマッチする
これは、前の文字と後ろの文字が同じ種類である位置にマッチする( 両方とも単語であるか、両方とも単語でない場合 )
文字列の先頭と終端は、単語ではないと見なされる
例えば?/\B../?は “noonday” の ‘oo’ に、/y\B./?は “possibly yesterday” の ‘ye’ にマッチする
\cX 文字列中の制御文字にマッチする
X?には A から Z のうち 1 文字が入る
例えば?/\cM/?は文字列中の control-M (U+000D) にマッチする
\d 数字にマッチする
[0-9]?に相当
例えば?/\d/?や?/[0-9]/?は “B2 is the suite number” の ‘2’ にマッチする
\D 数字以外の文字にマッチする
[^0-9]?に相当
例えば?/\D/?や?/[^0-9]/?は “B2 is the suite number” の ‘B’ にマッチする
\f 改ページ (U+000C) にマッチする
\n 改行文字 (U+000A) にマッチする
\r 復帰文字 (U+000D) にマッチする
\s スペース、タブ、改ページ、改行を含む 1 個の空白文字にマッチする
[ \f\n\r\t\v?\u00a0\u1680?\u180e\u2000?-\u200a?\u2028\u2029\u202f\u205f?\u3000\ufeff]?に相当
例えば?/\s\w*/?は “foo bar” の ‘ bar’ にマッチする
\S ホワイトスペース以外の 1 文字にマッチする
[^ \f\n\r\t\v?\u00a0\u1680?\u180e\u2000-\u200a?\u2028\u2029?\u202f\u205f?\u3000\ufeff]?に相当
例えば?/\S\w*/?は “foo bar” の ‘foo’ にマッチする
\t タブ (U+0009) にマッチする
\v 垂直タブ (U+000B) にマッチする
\w アンダースコアを含むどの英数字にもマッチする
[A-Za-z0-9_]?に相当
例えば?/\w/?は、”apple,” の ‘a’ や “$5.28,” の ‘5’ や “3D” の ‘3’ にマッチする
\W 前述以外の文字にマッチする
[^A-Za-z0-9_]?に相当
例えば?/\W/?や?/[^A-Za-z0-9_]/?は、”50%” の ‘%’ にマッチする
\n n?に正の整数が入る場合、正規表現内において?n?番目の括弧の部分にマッチした最新の部分文字列への後方参照となる( カッコの数は左からカウントする )
例えば?/apple(,)\sorange\1/?は “apple, orange, cherry, peach” の ‘apple, orange,’ にマッチする
?0 NULL 文字 (U+0000) にマッチする
この後ろに他の数字を続けることはできない( \0?の後に(0 から 7 までの)数字が続くと 8 進数のエスケープシーケンスとなるため )
\xhh hh(2 桁の 16 進数)コードからなる文字列にマッチする
\uhhhh hhhh(4 桁の 16 進数)コードからなる文字列にマッチする

▲目次へ戻る

無料説明会

SHARE

最新記事

無料説明会に参加してみる

INTERNOUS,inc. All rights reserved.

無料オンライン説明会へ