6時だョ!!全員集合!!

Rails・JavaScrictを中心にアウトプットします。

2021年11月25日 JavaScript (JS Primer) 正規表現

正規表現は英語で「Regular Expression」です。

正規表現で使用する特殊文字

 正規表現とは、「いくつかの文字列を一つの形式で表現するための表現方法」です。その「一つの形式で表現するため」に、いくつかのある文字に対して特別な意味を与えています。 - 以下に述べる文字がその役割を担っています。すべて半角です。

 
.   ^   $   [   ]   *   +   ?   |   (   )
 

これらの特殊文字正規表現では、「メタ文字」と呼んでいます。

正規表現オブジェクトを作成する 2つの方法。

正規表現リテラル正規表現オブジェクトを作成
const patternA = /パターン/フラグ;
RegExpコンストラクタで正規表現オブジェクトを作成
const patternB = new RegExp("パターン文字列", "フラグ");

「れげっくす」、「れぐいーえくすぴー」と呼ばれることが多いそうです。

正規表現リテラルRegExpコンストラクタの違い

正規表現リテラルRegExpコンストラクタの違いとして、正規表現のパターンが評価されるタイミングの違いがあります。 - 正規表現リテラルは、ソースコードをロード(パース)した段階で正規表現のパターンが評価されます。 - RegExpコンストラクタでは通常の関数と同じように、RegExpコンストラクタを呼び出すまで正規表現のパターンは評価されません。

正規表現リテラル

  • タイポしていたらその場でエラーになリます。
  • 正規表現リテラルの中で書かれた\はエスケープする文字として認識しません。

RegExpコンストラク

  • 変数を含んだ正規表現オブジェクトを作成できます。
  • 実行するまでタイポしていてもエラーになりません。
  • \から始まる正規表現を書く場合、エスケープとして認識されてしまうため\を2本つける必要があります。

以下のコードではRegExpコンストラクタで変数spaceCountの数だけ連続するホワイトスペースにマッチする正規表現オブジェクトを作成しています。

const spaceCount = 3;
const pattern = new RegExp(`\\s{${spaceCount}}`);
console.log(`\\s{${spaceCount}}`) => \s{3} // 1本目の\はエスケープさせる文字として認識されるため、出力結果では\が1本になっています。
console.log(`\s{${spaceCount}}`) => s{3} // 1本目の\は出力されないため正規表現のホワイトスペースを意味する\sが認識されません。

/\s{3}/にマッチする正規表現を文字列から作成しています。 バックスラッシュは、ただのエスケープ特殊文字として認識されてしまうため、2回書く必要があります。 ※ 主観ですが、正規表現リテラル外ではバックスラッシュは2本書く必要がある! と覚えてしまって良いかと思います。 - {数字}・・・正規表現では、指定した回数だけ繰り返しを意味する特殊文字として認識されます。

正規表現による検索

正規表現による検索は、正規表現オブジェクトと対応したStringオブジェクトまたはRegExpオブジェクトのメソッドを利用します。

正規表現によるインデックスの取得

String#indexOfメソッドの正規表現版ともいえるString#searchメソッドを使用します。

  • String#indexOf(検索文字列): 指定された文字列にマッチした箇所のインデックスを返す
  • String#search(/パターン/): 指定された正規表現のパターンにマッチした箇所のインデックスを返す

主観ですが、searchメソッドの引数には正規表現が入る事を覚えておくべきだと感じました。 - 文字列.serch(正規表現パターン)

const str = "ABC123EFG";
const searchPattern = /\d{3}/;
console.log(str.search(searchPattern)); // => 3
  • \dは半角数字を意味しています。
  • \d{3}は半角数字が3つあることを意味しています。
  • 文字列の中から半角数字が3つ並んでいる部分を検索し、マッチした部分の初めのインデックス番号を返しています。

参考

JSprimer 正規表現 正規表現サンプル集(Perlの参考)