JavaScript入門 | 正規表現 | 正規表現の応用
特殊文字
正規表現を使用して単純なパターンを検索したい場合は、探したい文字列を直接並べればよい。 しかし、数字だけを検索したり空白を探したりするなど、正確に一致するパターンより複雑な条件を使うには、特殊文字を使用する必要がある。
JavaScriptの正規表現で使用できる代表的な特殊文字は次のとおりである。
| 特殊文字 | 説明 |
|---|---|
| \ | バックスラッシュ(\)の後に通常文字が続くとエスケープ文字として解釈し、特殊文字が続くと通常文字として解釈する。 |
| \d | 数字を検索する。/[0-9]/と同じ。 |
| \D | 数字ではない文字を検索する。/[^0-9]/と同じ。 |
| \w | アンダースコア(_)を含む英字および数字を検索する。/[A-Za-z0-9_]/と同じ。 |
| \W | アンダースコア(_)、英字、数字ではない文字を検索する。/[^A-Za-z0-9_]/と同じ。 |
| \s | 空白、タブ、改行文字などの空白文字を検索する。 |
| \S | 空白、タブ、改行文字などの空白文字ではない文字を検索する。 |
| \b | 単語の先頭または末尾がパターンと一致するかを検索する。 |
| \xhh | 16進数hhに該当するUnicode文字を検索する。 |
| \uhhhh | 16進数hhhhに該当するUnicode文字を検索する。 |
次の例は、特殊文字\dを使用した正規表現の例である。
var targetStr = "ab1bc2cd3de";
var reg1 = /\d/; // 2 -> 0から9までの数字を検索する。
var reg2 = /[3-9]/; // 8 -> 3から9までの数字を検索する。
上の例で、1つ目の正規表現は0から9までの数字であるかを検索する。
この正規表現は/[0-9]/と同じ結果を返す。
2つ目の正規表現は3から9までの数字であるかを検索する。
正規表現で角括弧([])は特別な意味を持ち、下の括弧セクションでさらに詳しく学ぶ。
次の例は、特殊文字\sと\wを使用した正規表現の例である。
var targetStr = "abc 123";
// 空白文字を挟む、アンダースコア(_)を含む英字および数字で構成された文字列を検索する。
var reg = /\w\s\w/; // c 1
上の例で使用した正規表現は、1文字目としてアンダースコア(_)を含む英字および数字を検索する。
2文字目として、空白を含むタブや改行文字などの空白文字を検索する。
最後の3文字目として、再びアンダースコア(_)を含む英字および数字を検索する。
このように特殊文字を並べることで、それぞれの条件に該当する文字で構成された部分文字列を検索できる。
match()メソッドは、対象文字列から引数として渡された正規表現と一致する文字列をすべて探し、1つの配列として返すJavaScriptのStringメソッドである。
次の例は、特殊文字\bを使用した正規表現の例である。
var targetStr1 = "abc123abc"; // 7
var targetStr2 = "abc 123 abc"; // 1
var targetStr3 = "abc@123!abc"; // 1
// 単語の先頭または末尾に部分文字列"bc"が存在するかを検索する。
var reg = /bc\b/;
特殊文字\bを使用した正規表現は、単語の先頭または末尾がパターンと一致するかを検索する。
上の例で1つ目の正規表現は、対象文字列を1つの単語として認識し、両端に位置するパターンを検索する。
しかし2つ目と3つ目の正規表現は、対象文字列を複数の単語として認識し、すべての単語に対してパターンを検索する。
JavaScriptでは、アンダースコア(_)と英字、数字だけを単語に含められる文字として認識する。
したがって、それ以外のすべての文字は文字列内で単語を区切る文字として認識される。
量指定子
正規表現では、特殊文字によって数量を表すさまざまな量指定子を使用できる。
| 量指定子 | 説明 |
|---|---|
| n* | 直前の文字が0回以上現れる場合を検索する。/{0, }/と同じ。 |
| n+ | 直前の文字が1回以上現れる場合を検索する。/{1, }/と同じ。 |
| n? | 直前の文字が0回または1回だけ現れる場合を検索する。/{0,1}/と同じ。 |
var targetStr = "Hello World!";
var zeroReg = /lo*/; // 文字'l'の後に文字'o'が0回以上現れる場合を検索する。
var oneReg = /lo+/; // 文字'l'の後に文字'o'が1回以上現れる場合を検索する。
var zeroOneReg = /lo?/; // 文字'l'の後に文字'o'が0回または1回だけ現れる場合を検索する。
targetStr.search(zeroReg); // 2
targetStr.search(oneReg); // 3
targetStr.search(zeroOneReg); // 2
また、疑問符(?)記号が正規表現の量指定子(*、+、?、{})の直後に置かれると、可能な限り多くの文字を持つパターンを探す基本設定とは異なり、その量指定子が可能な限り少ない文字数のパターンを探すように変更する。
var targetStr = "123abc";
var oneReg = /\d+/; // 数字を検索する。/[0-9]/と同じ。
var anotherReg = /\d+?/; // 数字を検索するが、可能な限り少ない文字数のパターンを検索する。
targetStr.search(oneReg); // 123
targetStr.search(anotherReg); // 1
上の例で、1つ目の正規表現は1つ以上の数字だけを検索するため、文字列"123abc"から可能な限り多くの文字を持つ"123"を検索する。
しかし2つ目の正規表現のように直後に疑問符(?)記号を追加すると、可能な限り少ない文字を持つように変更されるため、"1"だけを検索する。
括弧
正規表現で使用できるさまざまな括弧の意味は次のとおりである。
| 括弧 | 説明 |
|---|---|
| a(b)c | 全体のパターンを検索した後、括弧内に明示された文字列を保存する。例: "abc"を検索した後にbを保存する。 |
| [abc] | 角括弧([])内に明示された文字を検索する。例: "abc"を検索する。 |
| [0-3] | 角括弧([])内に明示された数字を検索する。例: 0から3までの数字を検索する。 |
| [\b] | バックスペース文字を検索する。 |
| {n} | 前の文字が正確にn回現れる場合を検索する。nは必ず正の整数でなければならない。 |
| {m,n} | 前の文字が最小m回以上、最大n回以下で現れる場合を検索する。mとnは必ず正の整数でなければならない。 |
\bは単語の先頭または末尾がパターンと一致するかを検索する特殊文字であり、[\b]はバックスペース文字を検索する正規表現である。この2つを混同してはならない。
次の例は、括弧を使用してパターンを検索し、そのパターンを保存して位置を変更する例である。
var targetStr = "Hong Gil Dong";
var nameReg = /(\w+)\s(\w+)\s(\w+)/; // 空白文字を基準に各部分文字列を保存する。
var engName = targetStr.replace(nameReg, "$2 $3 $1"); // 1つ目の部分文字列を最後に移動する。
engName; // Gil Dong Hong
上の例で、括弧で囲まれた正規表現によって検索される3つの部分文字列は順番に保存される。
このときreplace()メソッドでは、このように保存された部分文字列を$1、$2、…、$n表現を利用して使用できる。
正規表現で使用される括弧は、capturing parenthesesとも呼ばれる。
このように保存された部分文字列はreplace()メソッドで使用できるだけでなく、正規表現の内部でも直接使用できる。
var targetStr = "abc 123 abc 123";
var oneReg = /(\w+) (\d+)/;
var anotherReg = /(\w+) (\d+) \1 \2/;
targetStr.match(oneReg); // abc 123, abc, 123
targetStr.match(anotherReg); // abc 123 abc 123, abc, 123
上の例で、1つ目の正規表現はアンダースコア(_)を含む英字および数字で構成された1つの部分文字列と、空白で区切られる数字で構成された別の部分文字列を検索する。
したがって対象文字列では、それぞれ最初の"abc"と"123"が検索されて保存される。
しかし2つ目の正規表現では、上のような方法で保存された部分文字列を正規表現内で再び使用している。
このとき正規表現内では、\1、\2、…、\n表現を利用して保存された部分文字列を使用できる。
match()メソッドは、正規表現と完全に一致する部分文字列だけでなく、括弧を使用して保存された部分文字列も一緒に返す。
位置文字
正規表現では、パターンを検索する単語の位置を指定できる。
| 文字 | 説明 |
|---|---|
| ^a | 単語の先頭に位置する該当パターンだけを検索する。例: aで始まる単語のaだけを検索する。 |
| a$ | 単語の末尾に位置する該当パターンだけを検索する。例: aで終わる単語のaだけを検索する。 |
var firstStr = "Php";
var secondStr = "phP";
var strReg = /^p/; // 'p'で始まる単語の'p'だけを検索する。
firstStr.match(strReg); // null
secondStr.match(strReg); // p