読者です 読者をやめる 読者になる 読者になる

しまてく

学んだ技術を書きためるブログ

正規表現パターンマッチング

正規表現(RegExp)オブジェクト

RegExpオブジェクトの作り方は次の2通り

前者の特徴は

    • プログラムに埋め込んで使う(静的)
    • お手軽

後者の特徴は

    • プログラム実行時に動的にRegExpオブジェクトを生成できる
    • なんとなくめんどくさい

例によってそれぞれまとめ。

文字 意味
[文字] 角括弧内の任意の1文字。
[^文字] 角括弧内の文字以外の任意の1文字。
. Unicodeの行末文字(\n)以外の任意の1文字。[^\n]と同じ。
\w 任意の単語文字(word character)1文字。[a-zA-Z0-9_]と同じ。
\W ASCII文字での単語文字以外の1文字。[^a-zA-Z0-9_]と同じ。
\s 任意のUnicode空白文字1文字。
\S Unicode空白文字以外の1文字。
\d 任意の数字1文字。[0-9]と同じ。
\D 数字以外の1文字。[^0-9]と同じ。
    • 繰り返し
文字 意味
{n,m} 直前の項目がn回からm回繰り返す文字列。
{n,} 直前の項目がn回以上繰り返す文字列。
{n} 直前の項目がn回繰り返す文字列。
? 直前の項目が0回、または1回繰り返す文字列。{0,1}と同じ。
+ 直前の項目を1回以上繰り返す。{1,}と同じ。
* 直前の項目を1回以上繰り返す。{0,}と同じ。
    • 非貪欲な繰り返し(JavaScript1.5以降)

繰り返し文字の後に「?」を付けると非貪欲な繰り返しになります。
※非貪欲とは必要最小限ということ
例)

/a.*b/   // 「aaabaab」の場合「aaabaab」が一致する。
/a.*?b/  // 「aaabaab」の場合「aaab」が一致する。
    • 選択、グループ化、参照
文字 意味
\ 選択(OR)。この記号の左右どちらかに一致する。
(文字列) グループ化。このグループに一致する文字を記憶する。
(?:文字列) グループ化のみ。このグループに一致する文字を記憶しない。
\n 左から数えてn番目のグループを指定。

例)

/cima|dai/        // 「cima」「dai」のいずれかに一致する。
/(miko)+nurse/    // 「mikonurse」「mikomikonurse」などに一致する。
/(miko)(nurse)\2/ //  \2は「nurse」を表す。
    • アンカー文字
文字 意味
^ 文字列の先頭。マルチライン検索では行の先頭。
$ 文字列の末尾。マルチライン検索では行の最後。
\b 単語境界。\w文字と\W文字 or \wと文字列の先頭または末尾の間の位置。
\B 単語境界ではない位置。
(?=p) 先読み言明。後に続く文字がパターンpに一致することが必要。パターンpに一致した部分の文字列は比較結果に含まれない。
(?!p) 否定先読み言明。後に続く文字がパターンpに一致しないことが必要条件。


例)

/^cima/          // 「cimadai」の「cima」に一致する。
/dai$/           // 「cimadai」の「dai」に一致する。
/\bdai/          // 「cima dai」の「dai」に一致する。「cimadai」の「dai」には一致しない。
/\Bdai/          // 「cimadai」の「dai」に一致する。「cima dai」の「dai」には一致しない。
/cimadai(?=\:)/  // 「cimadai」の後に「:」が続いていれば一致する。
/cimadai(?!\:)/  // 「cimadai」の後に「:」が続いていなければ一致する。
    • フラグ
文字 意味
i 大文字と小文字を区別しない。(ignoreCase)
g グローバル検索。最初に一致したものだけではなく、一致するものすべてを検索する。
m マルチラインモードで検索する。

↓僕がテスト的に正規表現を試すのに書いたコード(HTMLごと)

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <script type="text/javascript" src="./jquery.js"></script>
        <title>demo</title>
        <script type="text/javascript">
            function Reg(){
                var strSrc = document.getElementById("src").value
                var objReg = new RegExp( document.getElementById("reg").value, "g" );

                if( strSrc.match( objReg ) ){
                    $("#result").attr("value", strSrc.match( objReg ) );
                }else{
                    $("#result").attr("value", "not found" );
                }
            }
    </script>
</head>
<body>
    <table>
        <tr><td><input type="text" id="src" size="30" /></td></tr>
        <tr><td><input type="text" id="reg" size="30" /></td></tr>
        <tr><td><input type="button" value="チェック" onclick="Reg()"/></td></tr>
        <tr><td><input type="text" id="result" size="30" /></td></tr>
    </table>
</body>
</html>


正規表現って、、、面白っ!!!


正規表現使いこなしたらいろいろ夢が広がりそうですね\(^O^)/