正規表現を扱う2つの方法があります。
- まず正規表現は組み込みの RegExp クラスのオブジェクトであり、多くのメソッドを提供します。
- それに加えて、文字列の中に正規表現で動作するメソッドがあります。
構造は少しゴチャゴチャしているので、最初にメソッドを個別に考察し、その後で共通のタスクに対して実際のレシピを考えて行きます。
str.search(reg)
我々はすでにこのメソッドを見ました。これは最初にマッチした位置を、見つからない場合は -1 を返します。:
let str = "A drop of ink may make a million think";
alert( str.search( /a/i ) ); // 0 (先頭の位置)
重要な制限: search は常に最初のマッチを探します。
search を使用して次の位置を見つけることはできません(そのための構文はありません)。しかしそれができる別のメソッドがあります。
str.match(reg), “g” フラグなし
メソッド str.match は g フラグに応じて振る舞いが異なります。
まずは g がない場合を見てみましょう。
str.match(reg) は最初のマッチのみを探します
結果は、マッチしたものと追加プロパティを持つ配列です:
index– 文字列内でのマッチした位置input– 対象文字列
例:
let str = "Fame is the thirst of youth";
let result = str.match( /fame/i );
alert( result[0] ); // Fame (マッチしたもの)
alert( result.index ); // 0 (ゼロ位置)
alert( result.input ); // "Fame is the thirst of youth" (対象文字列)
配列は1つ以上の要素を持っている場合があります。
パターンの一部が丸括弧 (...) で区切られている場合、それは配列の別の要素になります
例:
let str = "JavaScript is a programming language";
let result = str.match( /JAVA(SCRIPT)/i );
alert( result[0] ); // JavaScript (マッチ全体)
alert( result[1] ); // script (括弧に対応するマッチした部分)
alert( result.index ); // 0
alert( result.input ); // JavaScript is a programming language
i フラグにより、検索は大文字小文字区別なしです。そのため、JavaScript を見つけます。SCRIPT に対応するマッチの一部は別の配列アイテムになります。
後ほど、チャプター キャプチャグループ で括弧について戻ります。括弧は検索と置換に最適です。
str.match(reg) “g” フラグ付き
"g" フラグがあると、str.match はすべてのマッチの配列を返します。その配列には追加のプロパティはなく、括弧は要素を作成しません。
例:
let str = "HO-Ho-ho!";
let result = str.match( /ho/ig );
alert( result ); // HO, Ho, ho (すべてのマッチ, 大文字小文字の区別なし)
括弧がある場合も変わりません。やってみましょう:
let str = "HO-Ho-ho!";
let result = str.match( /h(o)/ig );
alert( result ); // HO, Ho, ho
したがって、g フラグがあると、result はシンプルなマッチの配列になります。追加のプロパティはありません。
マッチした位置に関する情報を取得したり、括弧を使いたい場合は、下で説明する RegExp#exec メソッドを使用する必要があります。
match の呼び出しは null を返します注意してください、重要です。マッチするものがなかった場合、結果は空の配列ではなく null です。
次のような落とし穴を避けるために心に留めておいてください:
let str = "Hey-hey-hey!";
alert( str.match(/ho/gi).length ); // error! there's no length of null
str.split(regexp|substr, limit)
正規表現または部分文字列を区切り文字として使用して文字列を分割します。
私たちはすでに文字列で split を使いました。このようになります:
alert('12-34-56'.split('-')) // [12, 34, 56]
しかし、正規表現を渡すことも可能です。: