トップJavaScript-Tips > 正規表現

正規表現

1.正規表現とは

正規表現とは、 なんらかの規則性を持った多数の文字列をある一つの形式で表す表現方法である。 例えば、 二けたの数字三組が ":" で区切られているかどうかを調べるには次のようにする。

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

「^」は行頭、「$」は行末にマッチする。 (単に行頭、末尾にある文字列が一致するかどうかの判定は Java では startsWith, endsWith メソッドを使用する。)

この場合、次のように書くこともできる。

    str = "12:34:56";
    if (str.match(/^\d\d:\d\d:\d\d$/)) {
        alert("マッチしました。");
    }

文字列の置き換え関数replaceでの使用例を以下に示す。

    str = str.replace(/ /g, " ");	// 全角スペースを半角スペースに変換
    str = str.replace(/ +/g, " ");	// 2つ以上のスペースを一つにする
    str = str.replace(/^\s+|\s+$/g, "");   // trim: 先頭と末尾のスペースを取る

バックスラッシュ(\)に続く文字は特別な意味を持つ。
表現意味
\d任意の数値([0-9]と同じ)
\D\d以外の文字([^0-9]と同じ)
\w英数文字([A-Za-z0-9_]と同じ)
\W\w以外の文字
\sスペース(\f\r\n\t\v)
\r復帰
\n改行
\tタブ
\fラインフィード
\v垂直タブ
/.../ の後ろに記述する i, g, m フラグは下記のような意味を持つ。
フラグ意味
i大文字・小文字を区別しない(ignorecase/case-insensitive)
g 2番目、3番目... にマッチする部分も検索する(global)
m複数行に対して検索する(multi-line mode)

2.メタ文字

正規表現では、いくつかの文字列を一つの形式で表すために、

  .   ^   $   [   ]   *   +   ?   |   (   )   \   /
は特殊な意味を持つ。これらの文字を普通の文字として扱い時は、 C言語やJavaの文字列のときと同様に、その文字の前に、\ を付けて、
  \.   \^   \$   \[   \]   \*   \+   \?   \|   \(   \)   \\   \/
とする。

メタ文字の使い方を次の表にしめす。

正規表現 意味
[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
^行頭
$行末尾
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)

3.RegExpオブジェクトを用いた正規表現

RegExpオブジェクトの使用例を下に示す。 パターンをRegExpオブジェクト生成時の第一引数、フラグを第二引数とする。

<script type="text/javascript">
    var value = "aabbccAABBCC123456";
    var regex = new RegExp("bc", "ig");
    var result = value.match(regex);
    document.write(result);
</script>

この実行結果は次の通りである。


条件に合致する部分が2か所あり、配列で返される。

4.数式の字句解析

数式の字句解析では、多数の replace関数の実行が必要となるので、 for文の使うのが有効である。

次のプログラムでは、記号の前後にスペースを追加する。 その後、スペースが二つ以上の場合、一つに減らす。 また、前後のスペースも削除する。 最後に、スペースで分割して配列に変換している。

<script type="text/javascript">
    var expr = '(2+4)*(5 / 2.1)+2*5';
    var syms = [[/\+/g, ' + '], [/-/g, ' - '], [/\*/g, ' * '], [/\//g, ' / '],
	       [/\(/g, ' ( '], [/\)/g, ' ) '], [/  /g, ' '], [/^ /, ''], [/ $/, ''] ];
    for (var n = 0; n < syms.length; n++) {
        expr = expr.replace(syms[n][0], syms[n][1]);
    }
    tokens = expr.split(' ');
    document.write(tokens);
</script>

実行結果は次の通りである。


A.リファレンス

[1] 正規表現(regular expression)の基礎