正規表現(RegExp)

[up] [prev] [next]

■ 一覧

compile(), exec(), global, ignoreCase, index, input, lastIndex, lastMatch, lastParen, leftContext, match(), multiline, RegExp(), rightContext, source, test(), 正規表現, $&, $', $*, $+, $_, $`, $n

■ 正規表現オブジェクト

regexp = new RegExp(patern[, flag]) (e4/N4)

正規表現オブジェクトを生成します。正規表現オブジェクトは、文字列のパターンマッチングを行う際に用いられます。次の例は、match() を用いて文字列 str が "DEF" という文字列を含んでいるかどうかを検査します。

str = "ABCDEFG";
re = new RegExp("DEF", "i");
if (str.match(re)) {
    alert("DEFを含んでいます。");
}

new RegExp() は、すべてのものをオブジェクトとして実装するという JavaScript のポリシーに従って用意されたもので、あまり使用されていません。通常は次のように簡単に記述します。

str = "ABCDEF";
if (str.match(/DEF/i)) {
    alert("DEFを含んでいます。");
}

単に「DEF を含んでいる」という判定であれば index() を使用しても簡単にできますが、「12:34:56 のように、2桁の数値3つをコロン(:)で区切った文字列」といった複雑な検索ができるのが、正規表現の魅力です。

str = "12:34:56";
if (str.match(/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$/) {
    alert("マッチしました。");
}

RegExp() の flag には "i"、"g"、"m" の組み合わせを指定します。例えば i と g を指定する場合は "ig" を記述します。詳細は次節を参照してください。

regexp.ignoreCase (e55/N4)
regexp.global (e55/N4)
regexp.source (e4/N4)

ignoreCase は iフラグ(/.../i)が指定されているかどうかを示す真偽値。global は gフラグ(/.../g)が指定されているかどうかを示す真偽値。source は正規表現部(/.../)を示す文字列です。

re = new RegExp("DEF", "ig");
document.write(re.ignoreCase + "<br>");   // → true
document.write(re.global + "<br>");       // → true
document.write(re.source + "<br>");       // → DEF
RegExp.$記号 (e4/N4)

RegExp.$記号 の形式は、それぞれ以下の意味を持ちます。

表現 意味
RegExp.$nn番目の括弧に対応する文字列。下記参照。
RegExp.$&RegExp.lastMatch と同意。
RegExp.$`RegExp.leftContext と同意。
RegExp.$"RegExp.rightContext と同意。
RegExp.$+RegExp.lastParen と同意。
RegExp.$_RegExp.input と同意。
RegExp.$*RegExp.multiline と同意。

■ 正規表現の文法

正規表現では、次のようなマッチング表現を用いることができます。

正規表現 意味
AAという文字
ABCABCという文字列
[ABC]A、B、Cのいずれか1文字
[A-C]A〜Cまでのいずれか1文字
[^ABC]A、B、Cのいずれでもない任意の1文字
.任意の1文字
A+1文字以上のA
A*0文字以上のA
A?0文字または1文字のA
^AAで始まる文字列
A$Aで終わる文字列
ABC|DEF|GHIABCまたはDEFまたはGHI
A{2}2個のA(AA)
A{2,}2個以上のA(AA、AAA、AAAA、...)
A{2,3}2個〜3個のA(AA、AAA)
[\b]バックスペース

バックスラッシュ(\)に続く文字は特別な意味を持ちます。

表現 意味
\bスペースなどの単語の区切り
\B\b以外の文字
\cACtrl-A
\d任意の数値([0-9]と同じ)
\D数値以外の文字([^0-9]と同じ)
\fフォームフィード文字
\n改行文字
\r復帰文字
\s1文字の区切り文字([ \f\n\r\t\v])
\S\s以外の1文字
\tタブ文字
\v垂直タブ文字
\w英数文字([A-Za-z0-9_]と同じ)
\W\w以外の文字
\22番目の (...) にマッチした文字列
\o0338進数で033の文字
\x1b16進数で1bの文字
\その他その他の文字自身

RegExp() の第2引数や /.../ の後ろに記述する i、g、m などのフラグは下記のような意味を持ちます。

フラグ 意味
i大文字・小文字を区別しない
g2番目、3番目... にマッチする部分も検索する
m複数行に対して検索する (e55/N6)

i フラグを指定すると大文字小文字を区別しなくなります。

if ("abc".match(/ABC/)) { alert("マッチ!!"); }    // マッチしない
if ("abc".match(/ABC/i)) { alert("マッチ!!"); }   // マッチする

g フラグを指定すると最初にマッチした部分に加え、2番目、3番目...にマッチした部分も配列として返します。

xx = "12:34:56".match(/\d+/g);
document.write(xx.length + "<br>); // → 3
document.write(xx[0] + "<br>); // → "12"
document.write(xx[1] + "<br>); // → "34"
document.write(xx[2] + "<br>); // → "56"

m を指定すると、行頭(^)や行末($)のマッチングが文字列の先頭・末尾だけではなく、各行の行頭・行末にもマッチするようになります。Internet Explorer 5.5(?)、Netscape 6 から使用可能です。

str = "123\n456\n789";                           // \n は改行
if (str.match(/^456/)) { alert("マッチ!!"); }    // マッチしない
if (str.match(/^456/m)) { alert("マッチ!!"); }   // マッチする

正規表現内に (...) を指定すると、後でその (...) に対応する部分を取り出すことができます。

xx = "12:34:56".match(/(\d+):(\d+):(\d+)/);
document.write(RegExp.$1 + "<br>"); // → 12
document.write(RegExp.$2 + "<br>"); // → 34
document.write(RegExp.$3 + "<br>"); // → 56

■ マッチング

regexp(str) (N4)
regexp.exec([str]) (e4/N4)
str.match(regexp) (e4/N4)

マッチングを行い、マッチした部分文字列(g フラグ指定時は配列)を返します。exec() で str を省略した場合は、RegExp.input で指定された文字列に対してマッチングを行います。

re = new RegExp("[0-9]+");
document.write(re("abc123") + "<br>");              // → 123
document.write(re.exec("abc123") + "<br>");         // → 123
document.write("abc123".match(re) + "<br>");        // → 123
document.write("abc123".match(/[0-9]+/) + "<br>");  // → 123
regexp.test(str) (N4)

マッチングを行い、マッチしたかどうかを真偽値で返します。

re = new RegExp("[0-9]+");
if (re.test("abc123")) { alert("マッチ!!"); }
regexp.compile(patern[, flag]) (e4/N4)

高速化のために正規表現を内部表現形式にコンパイルしておきます。正規表現をあらかじめコンパイルしておくことにより、何度もマッチングを行う際の処理を高速化することができます。(ただ、実測してみたところではあまり差はありませんでした。)

re = new RegExp("");
re.compile("[0-9]+");
for (i = 0; i < 1000; i++) {
    if (str.match(re)) {
        :
    }
}
RegExp.input (e4/N4)

exec() でマッチングの対象とする文字列を代入します。$_ の省略形を用いることも可能。

re = new RegExp("[0-9]+");
RegExp.input = "abc123";
document.write(RegExp.exec() + "<br>");
RegExp.input = "xyz456";
document.write(RegExp.exec() + "<br>");
RegExp.multiline (e55/N4)

true を代入することにより、m フラグを指定するのと同様、複数行に対するマッチングで、行頭(^)や行末($)が各行の行頭、行末にマッチするようになります。短縮形の $* を用いることも可能。

RegExp.multiline = false;
document.write("123\n456\n789".match(/^456/) + "<br>");
RegExp.multiline = true;
document.write("123\n456\n789".match(/^456/) + "<br>");

■ マッチングの結果

RegExp.$n (e4/N4)

直前の正規表現マッチングにおける、n番目の (...) に対応する文字列を返します。

"12:34:56".match(/(\d+):(\d+):(\d+)/);
document.write(RegExp.$1 + "<br>");   // → 12
document.write(RegExp.$2 + "<br>");   // → 34
document.write(RegExp.$3 + "<br>");   // → 56
RegExp.index (e4)
RegExp.lastIndex (e4)
regexp.lastIndex (N4)

index はマッチした開始位置、lastIndex はマッチした部分の次の位置を返します。最初の文字の位置を 0 とします。

re = new RegExp("123");
"abc123def".match(re);
document.write(RegExp.index);     // → 3
document.write(RegExp.lastIndex); // → 6
document.write(re.lastIndex);     // → 6
RegExp.lastMatch (e55/N4)
RegExp.leftContext (e55/N4)
RegExp.rightContext (e55/N4)
RegExp.lastParen (e55/N4)

直前のマッチングにおいて、lastMatch は最後にマッチした文字列、leftContext はマッチした部分よりも左側の文字列、rightContext は右側の文字列、lastParen は最後の (...) に対応する文字列を返します。lastMatch、leftContext、rightContext、lastParen はそれぞれ、$&$`$'$+ の省略形を用いることもできます。

"abc123def".match(/(123)/);
document.write(RegExp.lastMatch + "<br>");    // → 123
document.write(RegExp.leftContext + "<br>");  // → abc
document.write(RegExp.rightContext + "<br>"); // → def
document.write(RegExp.lastParen + "<br>");    // → 123

[up] [prev] [next]
Copyright (C) 1996-2001 杜甫々
改訂版初版:2001年6月11日
http://www.tohoho-web.com/js/regexp.htm