- 正規表現 -
正規表現とは
異なる文字列を一つの形式で表現出来る
<<メタ文字>>
| . | 任意の1文字 | | | 選択 |
|---|---|---|---|
| * | 0回以上の繰り返し | + | 1回以上の繰り返し |
| ? | 0回または1回の繰り返し | () | 正規表現のグループ |
| ^ | 先頭 | $ | 末尾 |
| [] | 文字クラス | {n} | n回の繰り返し |
| {n,} | n回以上の繰り返し | {n,m} | n回以上m回以下の繰り返し |
| \ | メタ文字を文字として扱う |
■文字クラスの使い方
- [0258] []に入っているどれか1つの文字を表す。
- 先頭に^をつけると否定になる [^0258] 0258以外の1文字
- 数字やアルファベットが連続している場合は[0-9]と表す。[a-zA-Z]小文字のa〜zと大文字のA〜Z
| \w | [0-9a-zA-Z_] | 半角英数とアンダーバー |
|---|---|---|
| \W | [^0-9a-zA-Z_] | 半角英数と数字とアンダーバー以外 |
| \s | [\t\n\r\f] | 空白(半角スペース、タブ、改行) |
| \S | [^\t\n\r\f] | 空白(半角スペース、タブ、改行)以外すべて |
| \d | [0-9] | 数字 |
| \D | [^0-9] | 数字以外すべて |
正規表現でパターンマッチを行う場合に扱うオブジェクト
どんな事を調べたいか?マッチさせたいか。 そんな時に使うのがRegExp。
a = new RegExp("[a-z]{5}");
a〜zまでの小文字で 文字数5文字の単語を検索したい
a = new RegExp("[a-z]{5}","i"); //大文字、小文字を区別しない。
a = new RegExp("[a-z]{5}","g"); //マッチしたものすべて取得する。
iは他にマッチするものがあっても、最初にマッチしたものしか取得しない。 すべて取得したい場合には、gを付ける。
()の中のパターンを書き出すのが、RegExpオブジェクト。 それをマッチさせたい時に使うのがmatchメソッド
a = new String("I like pizar and sushi"); //String配列に文字を収納
b = new RegExp("[a-z]{5}","i"); //RegExpでパターンを生成
document.write(b);
m = a.match(/[a-z]{5}/i); //aの中でbのパターンにマッチする文字をmに収納する
document.write(m)
<<結果>>
/[a-z]{5}/i pizar ←pizarがマッチした
-------------------------------------------------
だから、
a = new String("I like pizar and sushi");
m = a.match(new RegExp("[a-z]{5}","i"));
document.write(m);
結果は同じになる
パターンマッチ
※matchメソッドは最初にマッチした1文字しか返さない。
その為、マッチするものすべて取得したい場合には + を付ける必要がある。
<script type="text/javascript">
a = new String("IloveYOU");
m = a.match(/[a-z]/i); //a〜zの大文字と小文字を区別しない
document.write(m);
</script>
--------------------------------------------
<<結果>>
I //最初にマッチする1文字しか返さない
あてはまらなければ null を返す
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<script type="text/javascript">
a = new String("IloveYOU");
m = a.match(/[a-z]+/i); //+を付けると、1回以上の繰り返し
document.write(m);
</script>
--------------------------------------------
<<結果>>
IloveYOU //文字列すべて抜き出せる。
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<script type="text/javascript">
a = new String("IloveYOU223あなた好きよ895");
m = a.match(/[0-9a-z]+/i);
document.write(m);
</script>
---------------------------------------------
<<結果>>
IloveYOU223 //[0-9a-z]にマッチしなくなる直前まで取得出来る
「あなた好きよ」の後に895数字があっても無視される
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<script type="text/javascript">
a = new String("IloveYOU223あなた好きよ895");
m = a.match(/95$/); //$は末尾を指定する
document.write(m);
</script>
---------------------------------------------
<<結果>>
95 //223を指定した場合は、文の末尾ではないのでnullが返される
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
<script type="text/javascript">
a = new String("IloveYOU223あなた好きよ895");
m = a.match(/.95$/); //.が付くと、以下95の1個前の文字を返す
document.write(m);
</script>
---------------------------------------------
<<結果>>
895 //なので結果は895になる
メールに半角英数字以外つかわれているかどうか
<script type="text/javascript">
a = new String("cc.9_c_uc@infoseek.co.jp");
m = a.match(/[a-zA-Z0-9_.]+@+[a-zA-Z0-9.]+$/);
//英数字と._ そして@を挟んで英数字と._が末尾になる
document.write(m);
</script>
---------------------------------------------
<<結果>>
cc.9_c_uc@infoseek.co.jp //$があるので、メルアドの末尾に全角文字
(空白とか半角の空白)があるとnullが返される
メールに半角英数字以外つかわれているかどうか
<script type="text/javascript">
a = new String("http://www.yahoo.co.jp/in/dex.html");
m = a.match(/^[a-z:.\/]+[a-zA-Z0-9_.\/]+html$|^[a-z:.\/]+[a-zA-Z0-9_.\/]+htm$/);
</script>
$末尾があるので、末尾がhtml又はhtmにいずれかが合致するとOK。
また半角英数字以外の文字(空白含む)が入力されると、null を返す。