--- title: RegExp slug: Web/JavaScript/Reference/Global_Objects/RegExp tags: - Constructor - JavaScript - Reference - RegExp - Regular Expressions - コンストラクター - 正規表現 translation_of: Web/JavaScript/Reference/Global_Objects/RegExp ---
RegExp
オブジェクトは、パターンでテキストを検索するために使用します。
正規表現を詳しく知りたい方は JavaScript ガイド の 正規表現 を参考にしてください。
RegExp
オブジェクトを生成するには二通りの方法があります。リテラル記法とコンストラクターです。
以下の三つの式は、同じ正規表現を生成します。
/ab+c/i new RegExp(/ab+c/, 'i') // リテラル記法 new RegExp('ab+c', 'i') // コンストラクター
リテラル記法では、正規表現が評価されるときにコンパイルを行います。正規表現が変化しない場合は、リテラル記法を使用してください。例えばループ内で使用する正規表現を生成するためにリテラル記法を使用すると、反復処理のたびに正規表現を再コンパイルすることはありません。
new RegExp('ab+c')
といった正規表現オブジェクトのコンストラクターは、実行時に正規表現をコンパイルします。正規表現パターンが変わることがわかっている場合や、パターンが不明でありユーザー入力など別のソースからパターンを取得する場合は、コンストラクター関数を使用してください。
ECMAScript 6 より、第 1 引数が RegExp
で第 2 引数に flags
を指定する場合 (new RegExp(/ab+c/, 'i')
) に {{jsxref("TypeError")}} ("can't supply flags when constructing one RegExp from another") が発生しません。代わりに、引数を元に新たな RegExp
が生成されます。
コンストラクター関数を使用する場合は、通常の文字エスケープ規則 (文字列内に特殊文字が含まれるとき、前に \
を付加する) が必須です。
例えば、以下 2 つの構文は同等です。
let re = /\w+/ let re = new RegExp('\\w+')
{{JSxRef("RegExp")}} のプロパティのいくつかは、長い名前と短い (Perl 風の) 名前があります。 Both names always refer to the same value. (Perl is the programming language from which JavaScript modeled its regular expressions.). See also deprecated RegExp
properties.
RegExp
オブジェクトを生成します。RegExp
オブジェクトのフラグから成る文字列です。.
が改行文字にマッチするかどうか。以下のスクリプトは、{{jsxref("Global_Objects/String", "String")}} インスタンスの {{jsxref("String.prototype.replace()", "replace()")}} メソッドを使用して、 first last 形式のフォーマットでの名前にマッチさせ、last, first 形式のフォーマットで出力しています。
置換テキスト中で、そのスクリプトは、$1
と $2
を使用して、それぞれ対応する正規表現パターンでマッチする括弧がキャプチャした結果を指定しています。
let re = /(\w+)\s(\w+)/ let str = 'John Smith' let newstr = str.replace(re, '$2, $1') console.log(newstr)
これは、 "Smith, John"
と表示します。
既定の行末文字は、プラットフォーム (Unix、Windows など) によって異なります。この例で実行する行分割は、あらゆるプラットフォームで動作します。
let text = 'Some text\nAnd some more\r\nAnd yet\rThis is the end' let lines = text.split(/\r\n|\r|\n/) console.log(lines) // logs [ 'Some text', 'And some more', 'And yet', 'This is the end' ]
正規表現内のパターンの順序が重要であることに注意してください。
let s = 'Please yes\nmake my day!' s.match(/yes.*day/); // null s.match(/yes[^]*day/); // Returns ["yes\nmake my day"]
{{JSxRef("Global_Objects/RegExp/sticky", "sticky")}} フラグは、対象文字列で {{jsxref("RegExp.prototype.lastIndex")}} からマッチングを試みることにより、正規表現の sticky マッチングを実行することを示します。
let str = '#foo#' let regex = /foo/y regex.lastIndex = 1 regex.test(str) // true regex.lastIndex = 5 regex.test(str) // false (lastIndex is taken into account with sticky flag) regex.lastIndex // 0 (reset after match failure)
sticky フラグ y
を付けると、次の一致は lastIndex
の位置で行われるのに対し、グローバルフラグ g
を付けると、検索は lastIndex
の位置から始められます。
re = /\d/y; while (r = re.exec("123 456")) console.log(r, "AND re.lastIndex", re.lastIndex); // [ '1', index: 0, input: '123 456', groups: undefined ] AND re.lastIndex 1 // [ '2', index: 1, input: '123 456', groups: undefined ] AND re.lastIndex 2 // [ '3', index: 2, input: '123 456', groups: undefined ] AND re.lastIndex 3 // ... and no more match.
グローバルフラグ g
を付けると、3桁だけでなく、6桁すべてが一致します。
上の表にもある通り、\w
や \W
は ASCII 基本文字にのみマッチします。具体的には a
から z
、A
から Z
、 0
から 9
および _
です。
キリル語やヘブライ語で使われるような非 ASCII 文字にマッチさせるには \uhhhh
形式 (hhhh
の部分は 16進表記の Unicode 値) を使ってください。
この例は、文字列全体から Unicode 文字列だけを抜き出す方法を示しています。
let text = 'Образец text на русском языке' let regex = /[\u0400-\u04FF]+/g let match = regex.exec(text) console.log(match[0]) // logs 'Образец' console.log(regex.lastIndex) // logs '7' let match2 = regex.exec(text) console.log(match2[0]) // logs 'на' [did not log 'text'] console.log(regex.lastIndex) // logs '15' // and so on
Unicode プロパティエスケープ機能は \p{scx=Cyrl}
のように単純な表記を可能にする解決策を導入しています。スクリプト別の完全な Unicode コードブロック (範囲) を知ることができる外部リソースも、 Regexp-Unicode-block などがあります。
let url = 'http://xxx.domain.com' console.log(/[^.]+/.exec(url)[0].substr(7)) // logs 'xxx'
仕様書 |
---|
{{SpecName('ESDraft', '#sec-regexp-regular-expression-objects', 'RegExp')}} |
{{Compat("javascript.builtins.RegExp")}}
Firefox 34 より、量指定子を伴うキャプチャグループが動作を妨げている場合に、キャプチャグループにマッチしたテキストが空文字列ではなく undefined
になります:
// Firefox 33 以前 'x'.replace(/x(.)?/g, function(m, group) { console.log("'group:" + group + "'"); }); // 'group:' // Firefox 34 以降 'x'.replace(/x(.)?/g, function(m, group) { console.log("'group:" + group + "'"); }); // 'group:undefined'
ウェブの互換性のため RegExp.$N
は引き続き、 undefined
ではなく空文字列を返します (bug 1053944)。