正規表現
正規表現の書き方
《正規表現》
/パターン/オプション
- 数字が4桁、先頭がアルファベットなどのルールの形式を「パターン」と呼びます
- パターンとチェック対象の文字列を照合することで、任意の形式に沿っているかどうかを調べます
- パターン内では「直前の文字が何文字分続くか」を表現する繰り返し文字を記述できます
パターンの表現方法一覧
文字 | 説明 |
---|---|
[ ] | 囲まれた中のいずれか一文字と一致する |
- | [ ]の中に記述した場合、文字の範囲を表す |
^ | 文字列の先頭を意味する [ ]の先頭に記述した場合は否定の意味 |
$ | 文字列の末尾を意味する |
. | 改行以外の一文字と一致する |
\n | 改行と一致する |
| | 複数の文字列のうちいずれかと一致する |
{ } | パターンをグループ化する グループ化するとグループ全体に対して繰り返し文字を適用できる |
繰り返し文字一覧
文字 | 説明 |
---|---|
? | 直前の文字0文字分か1文字分と一致する |
* | 直前の文字が0文字以上連続する箇所と一致する |
+ | 直前の文字が1文字以上連続する箇所と一致する |
{n} | 直前の文字n文字分と一致する |
{n,} | 直前の文字がn文字以上連続する箇所と一致する |
{n,m} | 直前の文字がn文字以上、m文字以下の範囲で連続する箇所と一致する |
オプション一覧
文字 | 説明 |
---|---|
i | 大文字と小文字を区別せずに照合する |
g | パターンと一致する部分文字列が複数ある場合、最初の1つだけでなくすべて検索する |
m | 複数行に渡る文字列に対して照合を行う場合に指定する ^は各行の先頭に、$はは各行の末尾に一致するようになる |
パターンの記述例
パターン1
- 文字列の中に abc が含まれているかどうかチェックする
/abc/
パターン2
- 文字列の中に a または b または c が含まれているかどうかチェックする
/[abc]/
パターン3
- 文字列の中に a〜z、A〜Zまでのいずれかの文字が含まれているかどうかチェックする
/[a-zA-Z]/
パターン4
- 文字列の中にアルファベットが含まれていないことをチェックする
/[^a-zA-Z]/
パターン5
- 文字列の中に abc または xyz が含まれているかどうかチェックする
/abc|xyz/
これらを組み合わせて電話番号をチェックする。
- 利用できる文字は数字とハイフンのみ
- 先頭は0で始まる
- 市外局番は1〜4桁
- 市内局番は1〜4桁
- 加入者番号は4桁
- ハイフンの有無は問わない
《電話番号チェックの正規表現》
/^0[0-9]{1,4}-?[0-9]{1,4}-?[0-9]{4}$/
正規表現の利用
《matchメソッドの利用》
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>matchメソッドの利用</title> <script> var date = '2013年3月31日'; var result = date.match( /[0-9]+/g ); console.log( result ); </script> </head> <body> </body> </html>
《実行結果》
- 日付を表す文字列の中から「1文字以上連続した数字」というパターンに一致する部分を探す
- オプションとして g が指定されているので、一致する部分が複数あればすべて取得します
- 結果、数字の部分だけ抜き出され「2013」「3」「31」が「/[0-9]+/」にマッチした3要素になります
《replaceメソッドの利用》
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>replaceメソッドの利用</title> <script> var message = 'This is a pen'; var result = message.replace( /is/g, 'at' ); console.log( result ); </script> </head> <body> </body> </html>
《実行結果》
- 「This is a pen」という文字列の中から「is」という文字列に一致する部分を探し、「at」に置き換えています
- オプションの「g」が付いているので、一致する部分すべてに対して置換がおこなわれます
文字 | 意味 |
---|---|
\ |
次のうちのいずれか:
|
^ |
入力の先頭にマッチします。複数行フラグが true にセットされている場合は、改行文字の直後にもマッチします。 例えば /^A/ は "an A" の 'A' にはマッチしませんが、"An E" の 'A' にはマッチします。この文字は、文字集合パターンの先頭にある場合は異なる意味を持ちます。 例えば /[^a-z\s]/ は "I have 3 sisters" の '3' にマッチします。 |
$ |
入力の末尾にマッチします。複数行フラグが true にセットされている場合は、改行文字の直前にもマッチします。 例えば /t$/ は "eater" の 't' にはマッチしませんが、"eat" の 't' にはマッチします。 |
* |
直前の文字の 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' にマッチします。
|
. |
(小数点) 改行文字以外のどの 1 文字にもマッチします。 例えば /.n/ は "nay, an apple is on the tree" の 'an' や 'on' にはマッチしますが、'nay' にはマッチしません。 |
(x) |
'x' にマッチし、マッチした内容を記憶します。これはキャプチャする括弧と呼びます。 例えば /(foo)/ mは "foo bar." の 'foo' にマッチし、これを記憶します。マッチした部分文字列は、結果として生成される配列の要素 [1] , ..., [n] から呼び出すことができます。 |
(?:x) |
'x' にマッチしますが、マッチした内容は記憶しません。これはキャプチャしない括弧と呼びます。マッチした部分文字列を、結果として生成される配列の要素 [1] , ..., [n] から呼び出すことはできません。 |
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 回出現するものにマッチします。例えば |
{n,m} |
例えば |
[xyz] |
文字の集合です。囲まれた文字のいずれかにマッチします。ハイフンを用いて文字の範囲を指定することも可能です。文字の集合内では、特殊文字 (例えばドット ( . ) やアスタリスク (* )) は特別な意味を持ちません。それらのエスケープは不要です。エスケープシーケンスでも動作します。例えば |
[^xyz] |
文字の集合の否定または補集合です。角括弧で囲まれていないものにマッチします。ハイフンを用いて文字の範囲を指定することも可能です。通常の文字の集合で動作するものすべてがこちらでも動作します。 例えば [^abc] は [^a-c] と同じです。これは始めに、"brisket" の 'r' や "chop" の 'h' にマッチします。 |
[\b] |
後退 (U+0008) にマッチします。(\b と混同してはいけません。) |
\b |
単語の区切りにマッチします。単語の区切りは、単語構成文字の前または後ろに別の単語構成文字がない位置にマッチします。マッチした単語の区切りは、マッチした部分に含まれないことに注意してください。言い換えると、マッチした単語の区切りの長さは 0 です。( [\b] と混同してはいけません。)例: /\bmoo/ は "moon" の 'm' にマッチします。
|
\B |
単語の区切り以外の文字にマッチします。これは、前の文字と後ろの文字が同じ種類である位置にマッチします。すなわち両方とも単語であるか、両方とも単語でない状況です。文字列の先頭と終端は、単語ではないと考えます。 例えば /\B../ は "noonday" の 'oo' に、/y\B./ は "possibly yesterday" の 'ye' にマッチします。 |
\cX |
X には A から Z のうち 1 文字が入ります。文字列中の制御文字にマッチします。 例えば |
\d |
数字にマッチします。 |
\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\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u2028\u2029\u202f\u205f\u3000] と同等です。例えば /\s\w*/ は "foo bar" の ' bar' にマッチします。 |
\S |
ホワイトスペース以外の 1 文字にマッチします。 [^ \f\n\r\t\v\u00A0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u2028\u2029\u202f\u205f\u3000] と同等です。例えば |
\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 番目の括弧の部分にマッチする最後の部分文字列への後方参照です (左括弧をカウントします)。 例えば |
\0 |
NULL (U+0000) 文字にマッチします。この後ろに他の数字と続けてはいけません。これは、\0<digits> が 8 進数のエスケープシーケンスであるためです。 |
\xhh |
hh (2 桁の 16 進数) というコードを持つ文字列にマッチする。 |
\uhhhh |
hhhh (4 桁の 16 進数) というコードを持つ文字列にマッチする。 |
※ユーザ入力を正規表現内の文字列リテラルとして扱うためには上記の記号は全てエスケープする必要があります。
- Webサイトの入力チェックは正規表現を使って行う