JavaScript/正規表現

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

JavaScriptの正規表現はPerl正規表現に影響を受けています。

おさらい: リテラルな文字列を検索する方法[編集]

正規表現で文字列を検索する前に、文字列で文字列を検索する下記のコードを学びましょう。

コード例

const str = "books";
let index = str.search("k");
console.log(~index ? `${index + 1}文字目にある。` : "ありません。");
index = str.search("z");
console.log(~index ? `${index + 1}文字目にある。` : "ありません。");

結果

4文字目にある。
ありません。

JavaScriptでは、まず文字列オブジェクトのsearch関数によって、探す文字列が何文字めに出現するかを返します。search関数は先頭の文字を0文字目として数えるため、上記コードでは +1 しています。 文字が見つからなかった場合、searchメソッドは -1 を返します。 ~indexは -1 と比較するイデオムで、-1 だったときだけ falsy になります。

正規表現を使用した検索[編集]

コード例

const str = "books";
const regex = /k/ ;
if( regex.test(str) ) {
  console.log("含まれる。");
}
else {
  console.log("含まれない。");
}


結果

含まれる。

正規表現とは、上記のコードの「/k/」の部分です。JavaScriptでは正規表現リテラルをスラッシュではじめ、スラッシュで終わらせます。フラグを用いる場合は、末尾のスラッシュに続けて記述します。

JavaScriptの正規表現のフラグ
フラグ 意味
g 繰り返しマッチさせる
i 大文字・小文字を区別しない
m 文字列を複数行として扱う
s .が空白文字にもマッチする
y 粘着的 (sticky) なマッチを行う
u ユニコードをベースにしたマッチを行う

まず、フラグを何も指定しない場合、大文字と小文字が区別されることを確認しましょう。 コード例

const str = "books";
const regex = /K/;
if(regex.test(str)) {
  console.log("含まれる。");
}
else {
  console.log("含まれない。");
}


結果

含まれない。

このように、iフラグ無しでは大文字と小文字は区別されます。

コード例

const aaa = "books";
const s = /K/i ;
if( s.test(aaa) ) {
  document.write("含まれている。");
}
else {
  document.write("含まれない。");
}

結果

含まれている。

iフラグを追加することで、大文字と小文字は区別されなくなります。

Unicode プロパティエスケープ[編集]

正規表現で

\p{Unicode プロパティエスケープ}

の形式でUnicode プロパティエスケープに基づくパターンマッチングが出来るようになりました。

const str = '絵文字はUNICODEに大々的に取り入れられたけれどサロゲートペアなのはきつい👿';

const emoji = /\p{Emoji_Presentation}/gu;
console.log(str.match(emoji)); // ["👿"]

名前付きキャプチャグループ[編集]

正規表現で

(?<name>pattern)

の形式で名前付きキャプチャグループが使えるようになりました。

$<name>

の形式で置き換え対象で参照出来ます。

const str = '今日昨日明日';

const today = /(?<today>今日)/gu;
console.log(str.replace(today, "$<today>(きょう)")); // 昨日今日(きょう)明日

実体[編集]

JavaScriptの正規表現オブジェクトの実体はRegExpオブジェクトのインスタンスです。RegExpオブジェクトのコンストラクタは第一引数に正規表現、第二引数にフラグを受け取ります。 第一引数の正規表現に\d\sなどのメタ文字が含まれる場合は、バックスラッシュが文字列リテラルのエスケープ文字として扱われないように、\\とエスケープする必要があります。

const regexp = new RegExp('\\d+', 'gim');

PerlのquotemetaRubyRegExp.quoteのように、()や[]など正規表現のメタ文字と解釈される可能性のある文字をエスケープして返す関数は、Stringオブジェクトのreplaceメソッドを使用して簡単に作成することができます。

const quote = str => str.replace(/\W/g,  $0 => `\\${$0}`);

alert( quote('()') ); // 「\(\)」と表示

プロパティ[編集]

RegExpオブジェクトのプロトタイプです。
このページ「JavaScript/正規表現」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にトークページへどうぞ。