リテラルな文字列を検索する方法 編集

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

コード例
const str = "books";

[..."abcdefghijklmnopqrstuvwxyz"].forEach(ch => {
    const index = str.search(ch);
    console.log(`'${ch}'は、`,~index ? `${index + 1}文字目にあります。` : "ありません。");
})
実行結果
'a'は、 ありません。
'b'は、 1文字目にあります。
'c'は、 ありません。
'd'は、 ありません。
'e'は、 ありません。
'f'は、 ありません。
'g'は、 ありません。
'h'は、 ありません。
'i'は、 ありません。
'j'は、 ありません。
'k'は、 4文字目にあります。
'l'は、 ありません。
'm'は、 ありません。
'n'は、 ありません。
'o'は、 2文字目にあります。
'p'は、 ありません。
'q'は、 ありません。
'r'は、 ありません。
's'は、 5文字目にあります。
't'は、 ありません。
'u'は、 ありません。
'v'は、 ありません。
'w'は、 ありません。
'x'は、 ありません。
'y'は、 ありません。 
'z'は、 ありません。

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

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

コード例
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/正規表現」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にトークページへどうぞ。