正規表現

正規表現とは

  • 入力チェック処理には、正規表現が用いられます
  • 正規表現とは、文字列のパターンを特定するための手法のことです

正規表現の書き方

正規表現


/パターン/オプション

  • 数字が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. 日付を表す文字列の中から「1文字以上連続した数字」というパターンに一致する部分を探す
  2. オプションとして g が指定されているので、一致する部分が複数あればすべて取得します
  3. 結果、数字の部分だけ抜き出され「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」が付いているので、一致する部分すべてに対して置換がおこなわれます


正規表現における特殊文字

文字 意味
\ 次のうちのいずれか:
  • 通常は文字どおりに扱われる文字に対して、次の文字は特殊であり文字どおりに解釈すべきではないと指示します。
  • 例えば /b/ は文字 'b' にマッチします。b の前にバックスラッシュを置いて /\b/ とすると、その文字は単語の区切りにマッチすることを意味する特殊文字になります。
  • 通常は特殊文字として扱われる文字に対して、次の文字は特殊ではなく文字どおりに解釈すべきであると指示します。
  • 例えば * は直前のアイテムの 0 回以上の出現にマッチすることを意味する特殊文字です。例えば /a*/ は 0 文字以上の a へのマッチを意味します。* という文字そのものにマッチさせるには、その直前にバックスラッシュを置きます。例えば /a\*/ は 'a*' にマッチします。
  • また、\ も文字列内ではエスケープ文字であることから、新たな RegExp("pattern") を記述する際は \ 自身のエスケープを忘れないようにしてください。
^
入力の先頭にマッチします。複数行フラグが 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' にマッチします。

*+?{} といった量指定子の直後に使用した場合、その量指定子を無欲 (最小回数にマッチ) にします。これはデフォルトとは逆であり、デフォルトは欲張り (最大回数にマッチ) です。例えば /\d+/ は非グローバルマッチで "123abc" の "123" にマッチしますが、/\d+?/ の場合は "1" だけにマッチします。

これは先読み表現内でも使用でき、この表の x(?=y) および x(?!y) にて説明します。

.
(小数点) 改行文字以外のどの 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 回出現するものにマッチします。

例えば /a{2}/ は "candy" の 'a' にはマッチしませんが、"caaandy" の最初の 2 つの a にはマッチします。

{n,m}

n および m には正の整数が入ります。直前の文字が少なくとも n 回、多くても m 回出現するものにマッチします。

n または m が 0 である場合、それを省略できます。

例えば /a{1,3}/ は "cndy" ではマッチせず、"candy," の 'a'、"caandy," の 最初の 2 つの a、"caaaaaaandy" の最初の 3 つの a にマッチします。"caaaaaaandy" では元の文字列に a が 4 つ以上ありますが、マッチするのは "aaa" であることに注意してください。

[xyz]
文字の集合です。囲まれた文字のいずれかにマッチします。ハイフンを用いて文字の範囲を指定することも可能です。文字の集合内では、特殊文字 (例えばドット (.) やアスタリスク (*)) は特別な意味を持ちません。それらのエスケープは不要です。エスケープシーケンスでも動作します。

例えば [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] と混同してはいけません。)

例:

/\bmoo/ は "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\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] と同等です。

例えば /\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<digits> が 8 進数のエスケープシーケンスであるためです。
\xhh hh (2 桁の 16 進数) というコードを持つ文字列にマッチする。
\uhhhh hhhh (4 桁の 16 進数) というコードを持つ文字列にマッチする。

※ユーザ入力を正規表現内の文字列リテラルとして扱うためには上記の記号は全てエスケープする必要があります。



  • Webサイトの入力チェックは正規表現を使って行う