カテゴリー
オライリーJavaScript

RegExpメソッド

RegExp()オブジェクトには、パターンマッチングを実行するメソッドが2つある
exec()メソッド

var pattern = /Java/g;
var text = "JavaScript is more fun than Java!";
var result;
while((result = pattern.exec(text)) != null) {
    alert("Matched '" + result[0] + "'" +
        " at position " + result.index +
        "; next search begins at + " + pattern.lastIndex);
}

test()メソッド
引数に指定された文字列がパターンに指定された正規表現とマッチすればtrueを返す

    var pattern = /java/i;
    pattern.text("JavaScript"); //true
カテゴリー
オライリーJavaScript

RegExpプロパティ

RegExpオブジェクトには、プロパティが5つある
source
正規表現の本体である文字列を格納する
読み出し専用

gloabal
正規表現にgフラグが設定さえているかどうかを示す論理値を格納する
読み出し専用

ignoreCase
正規表現にiフラグが設定さえているかどうかを示す論理値を格納する
読み出し専用

multiline
正規表現にmフラグが設定さえているかどうかを示す論理値を格納する
読み出し専用

lastIndex
次に検索を開始する文字列を示す整数を格納する
読み書き可能
exec()メソッドとtext()メソッドで使用する

カテゴリー
オライリーJavaScript

RegExpオブジェクト

RegExp()オブジェクトは、RegExp()コンストラクタの他に
3つのメソッドと多数のプロパティをサポートする

//文字列から5桁の数字をすべて検索する
//「\\」が使用されていることに注意
var zipcode = new RegExp("\\d{5}", "g");
カテゴリー
オライリーJavaScript

パターンマッチング用の文字列メソッド

Stringオブジェクトには、正規表現を使用するメソッドが4つある。
search()メソッド
search()メソッドに対して、検索する文字列の正規表現を引数に指定すると、
最初に見つけた文字列の先頭の文字列を示す番号を返す
見つからなかった場合は-1を返す

    "Javascript".search(/script/i); //4が返す

replace()メソッド
検索、置換を行う

    //大文字と小文字の使い方が統一されていなくても、
    //すべて「JavaScript」に統一する
    text.replace(/javascript/gi, "JavaScript");

    //変数quoteを定義する
    //引用符の間に任意の数の引用符以外の文字が含まれる
    var quote = /"([^"]*)"/g;

    //ストレート型の引用符をカール型の引用符に置き換える
    //引用符で囲まれた部分($1に格納されている)はそのままにしておく
    text.replace(quote, '$1');

match()メソッド
引数に正規表現を指定すると、一致した結果を格納した配列が返される
引数に正規表現以外を指定すると、
RegExp()コンストラクタに渡して正規表現に変換した上で比較が行われる
正規表現にgフラグが指定されていると、
一致したすべての文字列を含む配列を返す

    "1 plus 2 equals 2".match(/\d+/g)   //実行結果は["1", "2", "3"]

正規表現にgフラグがない場合は、
グローバル検索をせずに、最初に一致した文字列だけを返す。
ただし、グローバル検索を行わない場合でも、返されるのは配列

var url = /(\w):\/\/([\w.]+)\/(\S*)/;
var text = "Visit my blog at http://www.example.com/~david";
var result = text.match(url);
if (result != null) {
    var fullurl = result[0];    //「http://www.example.com/~david」
    var protocol = result[1];   //「http」
    var host = result[2];   //「www.example.com/」
    va path = result[3];    //「~david」
}

split()メソッド
指定された引数を区切り文字として使用し、文字列をいくつかに分割する

"123,456,789".split(",");   //「"123","456", "789"」

"1, 2, 3, 4, 5".split(/\s*,\s/);    //「"1","2","3","4","5"」     
カテゴリー
オライリーJavaScript

フラグ

正規表現のフラグ
i 大文字と小文字を区別しない
g グローバル検索
最初に一致したものだけでなく、一致するものをすべて検索する
m マルチラインモードにする
^は文字列の先頭と行の先頭に、
$は文字列の末尾と行の末尾に一致するようになる

カテゴリー
オライリーJavaScript

一致位置の指定

正規表現のアンカー文字
^ 文字列の先頭。マルチライン検索では行の先頭
$ 文字列の最後。マルチライン検索では行の最後
\b 単語境界。\w文字と\W文字との間の位置
あるいは、\w文字と文字列の先頭または末尾の間の位置
なお、[\b]はバックスペース
\B 単語境界ではない位置
(?=p) 先読み言明。後に続く文字がパターンpに一致することが必須表現
ただし、パターンpに一致した部分の文字列は、比較結果には含まれない
(?!p) 否定先読み言明。後に続く文字がパターンpに一致しないことが必要条件

カテゴリー
オライリーJavaScript

選択、グループ化、参照

| 選択。この記号の左右どちらかに一致する
(…) グループ化
複数の項目を1つにまとめ、*、+、?、|などの記号の対象とする
また、このグループに一致する文字を記憶しておいて
あとで参照できるようにする
(?:…) グループ化のみ
複数の項目を1つにまとめるが、このグループに一致する文字を記憶しない
\n グループ番号nで指定された部分表現に一致した文字列に一致する
部分表現は括弧で囲まれたもの
グループ番号は左から右方向に数えて、
左側の括弧が何番目であるかで表す

カテゴリー
オライリーJavaScript

非貪欲な繰り返し

貪欲な繰り返し
正規表現の残りの部分が一致する限り、できるだけ繰り返す。

非貪欲な繰り返し
繰り返し文字の後に疑問符?を記述する。

カテゴリー
オライリーJavaScript

繰り返し

2桁の数字 /\d\d/
4桁の数字 /\d\d\d\d/

正規表現の繰り返し文字
{n,m} 直前の項目をn回からm回まで繰り返す
{n,} 直前の項目をn回以上繰り返す
{n} 直前の項目をn回繰り返す
? 直前の項目を0回または1回だけ繰り返す
0回というのは、直前の項目がなくてもよいという意味 {0,1} と同じ
+ 直前の項目を1回以上繰り返す {1,} と同じ
* 直前の項目を0回以上繰り返す {0,} と同じ


/\d{2,4}/ 2桁から4桁までの数字
/\w{3}\d?/ 3この単語文字の直後に0個または1個の数字が続く文字列
/\s+java\s+/ 「java」の前後に1つ以上の空白がある文字列
/[^(]*/ 0回以上の開き括弧ではない文字列

カテゴリー
オライリーJavaScript

文字クラス

個々のリテラル文字を角括弧[]で囲むことで、文字クラスにまとめられる。
文字クラスは、そのクラスに含まれる任意の1文字に一致する。

/[abc]/
は、a,b,cのいずれか1つに一致する。

角括弧内の先頭にカレット^を指定すると否定文字クラスになる。

/[^abc]/
は、a,b,cのいずれでもない。

ハイフン(-)を使って、文字の範囲を指定させることができる。

/[a-z]/     //小文字
/[A-Za-z0-9]/   //英数字

正規表現の文字クラス
[…] 角括弧内の任意の1文字
[^…] 角括弧内の文字以外に任意の1文字
. 改行(Unikodeの行末文字)以外の文字 [^\n]と同じ
\w 任意の単語文字(word character) [A-Za-z0-9]と同じ
\W ASCII文字での単語文字以外の文字 [^A-Za-z0-9]と同じ
\s 任意のUnicode空白文字
\S Unicodeの空白以外の文字 \W とは異なることに注意
\d 任意の数字 [0-9]と同じ
\D 数字以外の文字 [^0-9]と同じ
[\b] リテラルバックスペース(特殊なケース)