「JavaScript/RegExp」の版間の差分

削除された内容 追加された内容
U14269 (トーク | 投稿記録)
JavaScript/標準ライブラリ/RegExp 12:05, 7 August 2015‎ UTC を転記
syntaxhighlight
11 行
 
次にHTMLの要素名を取得する例を示す。要素名は"<"の文字に続く英数字である。これを正規表現で検索するには、以下のように記述する。
<syntaxhighlight lang="JavaScript">
<nowiki>
/<[a-zA-Z0-9]+/ </nowiki>
</syntaxhighlight>
これでHTMLの要素名を取得するには完全ではないのだが、とりあえずその点を飛ばして解説をする。
JavaScriptでは、正規表現をスラッシュ"/"の間に記述をする。
19 ⟶ 20行目:
 
スラッシュで囲う表記法はJavaScriptで用意されているシンタックスシュガーで、実際には次の2つは意味的に等価である。
<syntaxhighlight lang="JavaScript">
<nowiki>
var regexp = new RegExp( "ab" );
var regexp = /ab/; </nowiki>
</syntaxhighlight>
 
=== 正規表現の作り方 ===
30 ⟶ 32行目:
==== クエスチョン『?』 ====
直前の文字が存在しなくてもいいような場合を表す。
<syntaxhighlight lang="JavaScript">
<nowiki>
/html? </nowiki>
</syntaxhighlight>
はhtmlとhtmいずれにもマッチする。
 
==== アスタリスク『*』 ====
直前の文字を0回以上繰り返した文字列を表す。
"<code>Yaho*</code>"と表記すると、"Yahoo"や"Yahooooooo"、"Yah"にマッチする。
 
==== プラス『+』 ====
直前の文字を1回以上繰り返した文字列を返す。
<code>Go+gle</code>」と表記すると"Google"、"Goooooogle"でもマッチするが"Ggle"ではマッチしない点がアスタリスクでの表記と異なる。
 
==== 中括弧『{n}』 ====
47 ⟶ 50行目:
 
例を挙げる。次の例は"Google"や"Goooooogle"にはマッチするが、"Gogle"にはマッチしない。
<syntaxhighlight lang="JavaScript">
<nowiki>
/Go{2,}gle/; </nowiki>
</syntaxhighlight>
 
"*","+","?","{n}","{n,}","{n,m}"等の文字のマッチ回数を表す文字を量指定子と言う。
66 ⟶ 70行目:
==== 括弧『(?:)』 ====
括弧の中の文字列を表す。フェンスと組み合わせて次のように使用できる。
<syntaxhighlight lang="JavaScript">
<nowiki>
/(?:りんご|ゴリラ|ラッパ) </nowiki>
</syntaxhighlight>
 
==== 括弧『()』 ====
75 ⟶ 80行目:
囲った範囲の文字のいずれか1文字を表す。
つまり次の2文は同じ意味を持つ。
<syntaxhighlight lang="JavaScript">
<nowiki>
/(?:0|1|2|3|4|5|6|7|8|9)/;
/[0123456789]/; </nowiki>
</syntaxhighlight>
 
==== ブラケット『[A-Z]』 ====
A~Zまでの文字列のいずれかを表す。
同様に"<code>[a-z]"</code>では小文字のa~zを、"<code>[0-9]"</code>では数字の0~9のいずれかを表す。
ちなみに、ブラケットとハイフンの組み合わせは複数記述できるため、
"<code>[0-9a-zA-Z_]"</code>とすれば、数字かアルファベット、アンダーバーのいずれかにマッチする。
 
==== 否定演算子『^』 ====
ブラケットの中で使用し、指定した文字以外を意味する。
"<code>[^A-Z]"</code>では大文字のアルファベット以外を意味する。
 
==== 半角スペース『 』 ====
93 ⟶ 99行目:
 
==== バックスラッシュ『\』 ====
直後の1文字の特殊文字をエスケープする。"<code>\|"</code>とすると"|"という文字を表す
 
==== その他の特殊文字 ====
147 ⟶ 153行目:
\b,\B のみ新しい概念なので解説する。
 
<syntaxhighlight lang="JavaScript">
<nowiki>
/alpha\b/; </nowiki>
</syntaxhighlight>
 
の場合、"alpha beta"にはマッチするが、"alphabet"にはマッチしない。
157 ⟶ 164行目:
全てにマッチするには、正規表現のオプションを利用して次のように表記する。
 
<syntaxhighlight lang="JavaScript">
<nowiki>
/ab/g </nowiki>
</syntaxhighlight>
 
最後についているgがオプションで、globalを表す。実行結果は次のようになる。
 
<syntaxhighlight lang="JavaScript">
<nowiki>
var s = "abrakadabra";
s = s.replace( /ab/g, '**' ); // **rakad**ra </nowiki>
</syntaxhighlight>
 
その他にも、さまざまなオプションが存在する。組み合わせて利用する場合には連続して記述をすればよい。
<syntaxhighlight lang="JavaScript">
<nowiki>
/ab/g;
/ab/igm; // i,g,mの3オプション
new RegExp( "ab", "i" );
new RegExp( "ab", "gm" ); </nowiki>
</syntaxhighlight>
 
それぞれのオプションの意味は次の通りである。
 
{| class="wikitable"
|-
|- align="left"
! オプション
! 説明
199 ⟶ 209行目:
マッチした文字列は保存され、後に取得が可能である。
 
<syntaxhighlight lang="JavaScript">
<nowiki>
// HTML中のタグを取得する
var s="bbb<em>aaaa</em>ccc";
var m = s.match(/<.+?>(.*?)<\/.+?>/);
m[0]; // <em>aaaa</em> が返る。
m[1]; // aaaa が返る。 </nowiki>
</syntaxhighlight>
 
1、2、3とマッチした文字列が括弧の順に格納されている。
210 ⟶ 221行目:
 
後方参照の必要がない場合には、括弧の内部に"?:"を挿入して次の様に記述する。
<syntaxhighlight lang="JavaScript">
<nowiki>
/(?:abc)+/; </nowiki>
</syntaxhighlight>
 
==== $1~$9 ====
正規表現を実行して、マッチした結果を返す。
 
<syntaxhighlight lang="JavaScript">
<nowiki>
// i,b,big等のタグをemタグへ変換する
s.replace( /(<\/?)(?:i|b|s|small|strike|big|tt)/i, '$1em' ); // $1で参照結果("<"か"</")を呼び出し</nowiki>
</syntaxhighlight>
 
=== 先読み ===
238 ⟶ 251行目:
==== source ====
与えられた正規表現を返す。
<syntaxhighlight lang="JavaScript">
<nowiki>
console.log( new RegExp( "<.+?>", "gim" ).source ); // 『<.+?>』が表示される </nowiki>
</syntaxhighlight>
 
==== global ====
正規表現にglobalオプション("g"のこと)が付いているかを返す。
 
<syntaxhighlight lang="JavaScript">
<nowiki>
(/ab/g).global; // trueが返る
(/ab/).global; // falseが返る
 
var rx = /ab/;
rx.global = true; // このようにしても値の設定は出来ないので注意 </nowiki>
</syntaxhighlight>
 
==== ignoreCase ====
正規表現にignoreCaseオプション("i"のこと)が付いているかを返す。
<syntaxhighlight lang="JavaScript">
<nowiki>
(/ab/ig).ignoreCase; // trueが返る </nowiki>
</syntaxhighlight>
 
==== multiline ====
正規表現にmultilineオプション("m"のこと)が付いているかを返す。
<syntaxhighlight lang="JavaScript">
<nowiki>
(/ab/im).multiline; // trueが返る </nowiki>
</syntaxhighlight>
 
==== lastIndex ====
文字列中で正規表現に最後にマッチした位置を返す。
<syntaxhighlight lang="JavaScript">
<nowiki>
var rx=/br/g;
rx.test("abracadabra");
270 ⟶ 287行目:
var rx=/br/g;
rx.lastIndex = 10;
rx.test("abracadabra"); // 11文字中、10文字目からの検索のため結果はマッチせずfalseが返る </nowiki>
</syntaxhighlight>
 
=== メソッド ===
280 ⟶ 298行目:
次の2文の場合は等価である。
 
<syntaxhighlight lang="JavaScript">
<nowiki>
// var s = "abracadabra"; が既に宣言されている
var m = s.match(/ab/g);
var m = (/ab/g).exec(s); </nowiki>
</syntaxhighlight>
 
==== test(string) ====
指定された正規表現を実行して、マッチする文字があったかどうかを真偽値型で返す。
<syntaxhighlight lang="JavaScript">
<nowiki>
var s="abracadabra";
if( (/ab/g).test( s ) ){
// ここから実際の処理
}
} </nowiki>
</syntaxhighlight>
 
==== toString() ====
作成した正規表現をオプション付きで返す。
<syntaxhighlight lang="JavaScript">
<nowiki>
console.log( new RegExp( "ab", "g" ).toString() ); // 「/ab/g」が表示される </nowiki>
</syntaxhighlight>
 
[[Category:JavaScript]]