JavaScriptの正規表現: JavaScript

Pocket

JavaScriptの正規表現のメモ。

正規表現の前にJavaScriptの文字列のエスケープシーケンスのメモ。

特殊文字はエスケープシーケンスで表す。エスケープシーケンスの始まりを表す文字をエスケープ文字という。JavaScriptのエスケープ文字はバックスラッシュ(\)。
エスケープシーケンス以外の\は無視される(例 \a は 単にa, \c は 単にc)[1]

\b バックスペース
\t (水平)タブ
\n ラインフィード・改行(New Line)
\v 垂直タブ
\f ホームフィード
\r キャリッジリターン
\\ バックスラッシュ
\' シングルクォート
\" ダブルクォート

\b, \v, \f, \rは使う場面が思い浮かばなかったのでほかのエスケープシーケンスだけを試す。

<form>
    <textarea id="tarea"></textarea>
</form>
var text;
text = 'abc\n'; // 改行の例
text += '\tdef'; // タブの例 タブのエスケープシーケンス\tに続けてdef
text += '\n\\jkl'; // バックスラッシュ\自体をエスケープ
text += '\n\'mno'; // 'クォート
text += '\n\"pqr'; // '文字列では"はエスケープの必要ないがしても問題はない。
text += '\n\x61'; // Latan- 1のコードポイント a
text += '\n\u0061'; // Unicodeのa
// text += 'stu\'; // 構文エラー
$('#tarea').val(text);

JavaScriptの文字列と正規表現の関係

正規表現オブジェクト(RegExpオブジェクト)は2通りの方法で生成できる。

  • RegExpコンストラクタ
  • 正規表現リテラル

RegExpコンストラクタ

var text = '\t123'; // 特殊文字タブ123

// 正規表現\sは空白を表す。
var pettern1 = '\s.+'; // \sはJavaScript文字列のエスケープシーケンスではないので単にs 。
// console.log(pettern1)  // pettern1の文字列はs.+
var regexp1 = new RegExp(pettern1); // s.+の正規表現オブジェクト作成
console.log(text.match(regexp1));   // null マッチ失敗

var pettern2 = '\\s.+'; // \\はバックスラッシュのエスケープシーケンスなのでpettern2は\s.+
// console.log(pettern2); // \s.+
var regexp2 = new RegExp(pettern2); // \s.+の正規表現オブジェクト作成
console.log(text.match(regexp2)); // [" 123"]

var pettern3 = '\t.+'; // \tはエスケープシーケンス。特殊文字タブ.+
var regexp3 = new RegExp(pettern3); // 特殊文字タブ.+の正規表現オブジェクト作成
console.log(text.match(regexp3)); // [" 123"]

var pettern4 = '\\t.+'; // \t.+
var regexp4 = new RegExp(pettern4); // \t.+の正規表現オブジェクト作成
console.log(text.match(regexp4)); // [" 123"]

// 正規表現の\tとJavaScript文字列のエスケープシーケンス\tはたまたま同じなので\tと\\tは同じ結果になる
// 改行を表す\nも同様の動作

var pettern5 = '\d.+'; // d.+
var regexp5 = new RegExp(pettern5); // d.+の正規表現オブジェクト作成
console.log(text.match(regexp5)); // null マッチ失敗

var pettern6 = '\\d.+'; // \d.+
var regexp6 = new RegExp(pettern6); // \d.+の正規表現オブジェクト作成
console.log(text.match(regexp6)); // ["123"]

正規表現リテラル

正規表現リテラル(//)は直接RegExpオブジェクトを生成するので\をエスケープしない。

var pettern7 = /\d.+/; // \d.+
console.log(text.match(pettern7)); // ["123"]

var pettern8 = /\\d.+/; // \\d.+
console.log(text.match(pettern8)); // null マッチ失敗

jsFiddle

[1] \が単独で使われたり文字列の末尾に置かれると構文エラー(unterminated string literal)

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。