RegExp【正規表現:Regular Expression】オブジェクト

メモ コンストラクタ プロパティ 一覧 メソッド 一覧 関連オブジェクト・メソッド 検索フラグ 正規表現パターン 正規表現パターン例

メモ

概要

基本処理

注意事項

  • 処理時間のかかる正規表現に注意
    • ネスト:(例) /^([0-9]+)*$/  に対して "9~9#"
    • 重複:(例) /(x|xx)+/
    • 文字長の制限なし

外部リンク


正規表現リテラル・コンストラクタ

構文説明引数
/pattern/ [flags] 正規表現リテラル pattern:正規表現パターン
flags:検索フラグ
[new] RegExp ( "pattern" [, "flags" ] ) コンストラクタ

プロパティ 一覧〔

プロパティ説明
RegExp.$1 ~ $9 キャプチャ文字列 (正規表現パターン参照)
RegExp[ @@species ] コンストラクタ定義 (実装:[Symbol.species])
RegExp.prototype.constructorコンストラクタ定義
RegExp.prototype.dotAll 's'【改行文字対応】フラグ 使用有無 (true / false)
RegExp.prototype.flags 検索フラグ ("gimsuy" の内で使用している検索フラグの文字列)
RegExp.prototype.global 'g'【グローバル検索】フラグ 使用有無 (true / false)
RegExp.prototype.hasIndices 'd'【キャプチャ部分の範囲インデックス取得】フラグ 使用有無 (true / false)
RegExp.prototype.ignoreCase 'i'【大文字小文字区別なし】フラグ 使用有無 (true / false)
RegExp. input ($_) 検索文字列
RegExp.lastIndex次回検索の開始位置 (初期値:0 / 書き込み可能)
'g'【グローバル検索】 または 'y'【検索開始位置固定】フラグ 指定で利用
RegExp. lastMatch ($&) 最後に一致した文字列 (~.$& は使用不可 → ~["$&"] を使用)
RegExp. lastParen ($+) 最後の括弧内の部分文字列の一致 (~.$+ は使用不可 → ~["$+"] を使用)
RegExp. leftContext ($`) 最後に一致した左側の部分文字列 (~.$` は使用不可 → ~["$`"] を使用)
RegExp.prototype.multiline 'm'【複数行検索】フラグ使用有無 (true / false)
RegExp.prototype プロトタイプ
RegExp. rightContext ($') 最後に一致した右側の部分文字列 (~.$' は使用不可 → ~["$'"] を使用)
RegExp.prototype.source 正規表現パターン
RegExp.prototype.sticky 'y'【検索開始位置固定】フラグ使用有無 (true / false)
RegExp.prototype.unicode 'u'【Unicode】フラグ使用有無 (true / false)

メソッド 一覧

メソッド説明
RegExp.prototype [ @@match ] ( string ) 検索 (詳細) (実装:[Symbol.match])
String.match()【正規表現検索 (詳細)】 から呼び出し
正規表現判定 (Boolean 型):falseの場合、下記メソッドの例外を回避
String.startsWith【開始文字列判定】
String.endsWith【終了文字列判定】
String.includes【部分文字列判定】
RegExp.prototype [ @@matchAll ] ( string ) 検索 (詳細イテレータ) (実装:[Symbol.matchAll])
String.matchAll()【正規表現検索 (詳細イテレータ)】 から呼び出し
RegExp.prototype [ @@replace ] ( string, replaceValue ) 置換 (関数指定可) (実装:[Symbol.replace])
String.replace()【置換 (正規表現可・関数指定可)】 から呼び出し
RegExp.prototype [ @@search ] ( string ) 検索 (簡易) (実装:[Symbol.search])
String.search()【正規表現検索 (詳細)】 から呼び出し
RegExp.prototype [ @@split ] ( string, limit ) 分割 (実装:[Symbol.split])
String.split()【分割 (正規表現可)】 から呼び出し
RegExp.prototype.compile(pattern, flags ) コンパイル
RegExp.prototype.exec( string )検索
RegExp.prototype.test( string ) 検索評価
RegExp.prototype.toString() 文字列変換

関連オブジェクト・メソッド

正規表現の指定が可能なその他のオブジェクト・メソッド

オブジェクトメソッド説明
String【文字列】オブジェクト match ( regexp )正規表現検索 (詳細)
matchAll ( regexp ) 正規表現検索 (詳細イテレータ)
replace ( searchValue, replaceValue ) 置換 (正規表現可・関数指定可)
replaceAll ( searchValue, replaceValue ) 全置換 (正規表現可・関数指定可)
search ( regexp ) 正規表現検索 (簡易)
split ( [separator [, limit]] ) 分割 (正規表現可)

検索フラグ

検索フラグプロパティ説明
dhasIndices キャプチャ部分の範囲インデックス取得
(取得結果は、exec【検索】参照)
gglobal グローバル検索 (lastIndex【次回検索の開始位置】プロパティを使用し、次回の処理に利用)
iignoreCase 大文字小文字の区別なし
mmultiline 複数行の検索 (^:行頭 / $:行末)
sdotAll 改行文字対応 (.【改行以外の 1 文字】に改行を含む)
uunicode Unicode対応 (コードポイント値を使用し、サロゲートペア対応とする)
ysticky 検索開始位置固定 (lastIndex【次回検索の開始位置】プロパティを開始位置に固定して処理)

正規表現パターン

正規表現パターン説明
^先頭 'm'【複数行検索】フラグが指定された場合、行頭
$末尾 'm'【複数行検索】フラグが指定された場合、行末
.改行以外の 1 文字 ('s'【改行文字対応】フラグ が指定された場合、改行も含む)
パターン*パターン の 0 回以上の繰り返し (最長一致)
パターン*?パターン の 0 回以上の繰り返し (最短一致)
パターン+パターン の 1 回以上の繰り返し (最長一致)
パターン+?パターン の 1 回以上の繰り返し (最短一致)
パターン?パターン の 0 回か 1 回 (最長一致)
パターン??パターン の 0 回か 1 回 (最短一致)
パターン{n} パターンn 回の繰り返し (最長一致 / n:正数)
パターン{n}? パターンn 回の繰り返し (最短一致 / n:正数)
パターン{n,} パターンn 回以上の繰り返し (最長一致 / n:正数)
パターン{n,}? パターンn 回以上の繰り返し (最短一致 / n:正数)
パターン{n,m} パターンn 回 ~ m 回の繰り返し (最長一致 / nm:正数)
パターン {n,m}? パターンn 回 ~ m 回の繰り返し (最短一致 / nm:正数)
パターンA|パターンB パターン を区切り、どちらかの パターン と一致
[文字の集合] 文字の集合 内の文字 (- で範囲指定)
[^文字の集合] 文字の集合 内の文字以外 (- で範囲指定)
(パターン) 後方参照ありのキャプチャ (後方参照:$1~$9)
(?:パターン) 後方参照なしのキャプチャ (後方参照不可)
(?<キャプチャ名> パターン) 名前付きキャプチャ  (例:exec【検索】)
後方参照:\k<キャプチャ名> または \1 ~ \9
メソッド等の参照:$<キャプチャ名> または $1 ~ $9
パターン(?=パターン (後)) 肯定先読みパターンパターン (後) が続く
パターン(?!パターン (後)) 否定先読みパターンパターン (後) が続かない
(?<=パターン (前)) パターン 肯定後読みパターン (前)パターン が続く
(?<!パターン (前)) パターン 否定後読みパターン (前) でない後に パターン が続く
\~エスケープシーケンス
\1 ~ \9キャプチャの後方参照 (名前付きキャプチャも含む)
(メソッド等からは $1 ~ $9 で参照)
\k<キャプチャ名> 名前付きキャプチャの後方参照
(メソッド等からは $<キャプチャ名> で参照)
\b単語の区切り
\B単語の区切り以外
\d数字 ( '[0-9]' に相当 )
\D数字以外 ( '[^\d]' に相当 )
\f改ページ (\u000C:form feed)
\n改行 (\u000A:line feed)
\p{プロパティ名}
\p{プロパティ値}
\p{プロパティ名=プロパティ値}  
プロパティ名 を持つ Unicode文字
プロパティ値 を持つ Unicode文字
プロパティ名 の値が プロパティ値 である Unicode文字
'u'【Unicode対応】フラグ指定
プロパティ名・プロパティ値は外部リンクの参照
\P{プロパティ名}
\P{プロパティ値}
\P{プロパティ名=プロパティ値}  

プロパティ名 を持たない Unicode文字
プロパティ値 を持たない Unicode文字
プロパティ名 の値が プロパティ値 でない Unicode文字
'u'【Unicode対応】フラグ指定
プロパティ名・プロパティ値は外部リンクの参照
\r復帰 (\u000D:carriage return)
\s空白文字 (下記が対象)
Unicodeメタ文字 / 文字参照説明
\u000C\fフォームフィード (FF:Form Feed)
\u000A\nラインフィード (LF:Line Feed)
\u000D\r復帰 (CR:Carriage Return)
\u0009\t水平タブ (Horizontal Tab)
\u000B\v垂直タブ (Vertical Tab)
\u0020半角スペース (Space)
\u00A0&nbsp;改行なし半角スペース (No-Break Space)
\u1680
\u180E
\u2000En Quad
\u2001Em Quad
\u2002&ensp;En Space
\u2003&emsp;Em Space
\u2004Three-Per-Em Space
\u2005Four-Per-Em Space
\u2006Six-Per-Em Space
\u2007Figure Space
\u2008Punctuation Space
\u2009&thinsp;Thin Space
\u200AHair Space
\u200BZero Width Space
\u2028Line Separator
\u2029Paragraph Separator
\u202FNarrow No-Break Space
\u205FMedium Mathematical Space
\u3000全角スペース (Ideographic Space)
\uFEFFZero Width No-Break Space / BOM (Byte Order Mark)
\S空白文字以外 ( '[^\s]' に相当 )
\tタブ (\u0009:horizontal tab)
\uHHHH16進数定義
\v垂直タブ (\u000B:vertical tab)
\w文字 (半角英数字 及び アンダースコア(_)) ( '[A-Za-z0-9_]' に相当 )
\W文字以外 ( '[^\w]' に相当 )

パターン:検索位置移動
パターン:検索位置移動なし

正規表現パターン例

検索対象正規表現パターン
数字[0-9]
半角英字[A-Za-z]
半角英大文字[A-Z]
半角英小文字[a-z]
ひらがな[ぁ-ん]
全角カタカナ[ァ-ヴ]
半角カタカナ[ヲ-゚]
改行を含む任意の文字 [\s\S]
. ('s'【改行文字対応】フラグ指定)
Eメールアドレス
(HTML 5.1・WHATWG)
/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/

基本処理

//           0123456789+123456789+123456789+123456789+1234
const str = "The quick brown fox jumps over the lazy dog.";

// RegExp.exec (1/2)
const regex1 = /brown (\w+)/;
let result1 = regex1.exec(str);
console.log(result1);
// 出力例:
// (2) ['brown fox', 'fox', index: 10, input: 'The quick brown fox jumps over the lazy dog.', groups: undefined]
//   0: "brown fox"
//   1: "fox"
//   groups: undefined
//   index: 10
//   input: "The quick brown fox jumps over the lazy dog."
//   length: 2
//   [[Prototype]]: Array(0)

// RegExp.exec (2/2)
const regex2 = new RegExp("lazy (\\w+)");
let result2 = regex2.exec(str);
console.log(result2);
// 出力例:
// (2) ['lazy dog', 'dog', index: 35, input: 'The quick brown fox jumps over the lazy dog.', groups: undefined]
//   0: "lazy dog"
//   1: "dog"
//   groups: undefined
//   index: 35
//   input: "The quick brown fox jumps over the lazy dog."
//   length: 2
//   [[Prototype]]: Array(0)

// String.match
let result3 = str.match(/brown (\w+)/);
console.log(result3);
// 出力例:
// (2) ['brown fox', 'fox', index: 10, input: 'The quick brown fox jumps over the lazy dog.', groups: undefined]
//   0: "brown fox"
//   1: "fox"
//   groups: undefined
//   index: 10
//   input: "The quick brown fox jumps over the lazy dog."
//   length: 2
//   [[Prototype]]: Array(0)

// String.replace
let result4 = str.replace(/(lazy) \w+/, "$1 'tanuki'");
console.log(result4);
// 出力例:
// The quick brown fox jumps over the lazy 'tanuki'.

プロパティ

console.log(RegExp[Symbol.species]);    // 出力:function RegExp() { [native code] }
console.log(RegExp.prototype);          // 出力:Object {...}

var regex = /([0-9]+)-([0-9]+)-([0-9]+)/;
console.log(regex.constructor);         // 出力:function RegExp() { [native code] }
console.log(regex.source);              // 出力:([0-9]+)-([0-9]+)-([0-9]+)
console.log(regex.test("123-abc-456")); // 出力:false
console.log(regex.test("123-456-789")); // 出力:true
console.log(RegExp.$1, RegExp.$2, RegExp.$3); // 出力:123 456 789
var regex = /^([a-z]+)-([a-z]+)-([a-z]+)/gim;
console.log(regex.flags, regex.global, regex.ignoreCase, regex.multiline, regex.sticky, regex.unicode);
// 出力:gim true true true false false

var str = "AAA-bbb-CCC-ddd-EEE\nfff-GGG-hhh-III-jjj";
var i = 1;
while (true) {
  var result = regex.exec(str);
  if (result == null) {
    break;
  }
console.log("[ " + i++ + " 回目 ]");
console.log(result);
console.log(regex.lastIndex);
console.log(RegExp.$1, RegExp.$2, RegExp.$3);
console.log("RegExp.input = [" + RegExp.input + "]");
console.log("RegExp.$_ = [" + RegExp.$_ + "]");
console.log("RegExp.lastMatch = [" + RegExp.lastMatch + "]");
console.log("RegExp[\"$&\"] = [" + RegExp["$&"] + "]");
console.log("RegExp.lastParen = [" + RegExp.lastParen + "]");
console.log("RegExp[\"$+\"] = [" + RegExp["$+"] + "]");
console.log("RegExp.leftContext = [" + RegExp.leftContext + "]");
console.log("RegExp[\"$`\"] = [" + RegExp["$`"] + "]");
console.log("RegExp.rightContext = [" + RegExp.rightContext + "]");
console.log("RegExp[\"$'\"] = [" + RegExp["$'"] + "]");
}
// 出力:[ 1 回目 ]
// 出力:["AAA-bbb-CCC", "AAA", "bbb", "CCC", index: 0, input: "AAA-bbb-CCC-ddd-EEE↵fff-GGG-hhh-III-jjj"]0: "AAA-bbb-CCC"1: "AAA"2: "bbb"3: "CCC"index: 0input: "AAA-bbb-CCC-ddd-EEE↵fff-GGG-hhh-III-jjj"length: 4__proto__: Array[0]
// 出力:11
// 出力:AAA bbb CCC
// 出力:RegExp.input = [AAA-bbb-CCC-ddd-EEE
// 出力:fff-GGG-hhh-III-jjj]
// 出力:RegExp.$_ = [AAA-bbb-CCC-ddd-EEE
// 出力:fff-GGG-hhh-III-jjj]
// 出力:RegExp.lastMatch = [AAA-bbb-CCC]
// 出力:RegExp["$&"] = [AAA-bbb-CCC]
// 出力:RegExp.lastParen = [CCC]
// 出力:RegExp["$+"] = [CCC]
// 出力:RegExp.leftContext = []
// 出力:RegExp["$`"] = []
// 出力:RegExp.rightContext = [-ddd-EEE
// 出力:fff-GGG-hhh-III-jjj]
// 出力:RegExp["$'"] = [-ddd-EEE
// 出力:fff-GGG-hhh-III-jjj]

// 出力:[ 2 回目 ]
// 出力:["fff-GGG-hhh", "fff", "GGG", "hhh", index: 20, input: "AAA-bbb-CCC-ddd-EEE↵fff-GGG-hhh-III-jjj"]
// 出力:31
// 出力:fff GGG hhh
// 出力:RegExp.input = [AAA-bbb-CCC-ddd-EEE
// 出力:fff-GGG-hhh-III-jjj]
// 出力:RegExp.$_ = [AAA-bbb-CCC-ddd-EEE
// 出力:fff-GGG-hhh-III-jjj]
// 出力:RegExp.lastMatch = [fff-GGG-hhh]
// 出力:RegExp["$&"] = [fff-GGG-hhh]
// 出力:RegExp.lastParen = [hhh]
// 出力:RegExp["$+"] = [hhh]
// 出力:RegExp.leftContext = [AAA-bbb-CCC-ddd-EEE
// 出力:]
// 出力:RegExp["$`"] = [AAA-bbb-CCC-ddd-EEE
// 出力:]
// 出力:RegExp.rightContext = [-III-jjj]
// 出力:RegExp["$'"] = [-III-jjj]
// 【'y'(検索開始位置固定) フラグ】
var str = "999aaaAAA";
var regex = /[a-z]+[A-Z]+/;
console.log(regex.test(str));   // 出力:true

var regexY = /[a-z]+[A-Z]+/y;
regexY.lastIndex = 0;
console.log(regexY.test(str));  // 出力:false
regexY.lastIndex = 3;
console.log(regexY.test(str));  // 出力:true
// 【'u'(Unicode) フラグ】
// 叱る (第1水準)
// 𠮟る (第3水準) \u{20B9F}
var str = "叱る・\u{20B9F}る"
console.log(str); // 出力:叱る・𠮟る

// 𠮟 が2文字と認識
var regex = /.る/g;
while (true) {
  var result = regex.exec(str);
  if (result == null) {
    break;
  }
console.log(result);
}
// 出力:["叱る", index: 0, input: "叱る・𠮟る"]
// 出力:["(不正文字)る", index: 4, input: "叱る・𠮟る"]

// 𠮟 が1文字と認識
var regexU = /.る/gu;
while (true) {
  var result = regexU.exec(str);
  if (result == null) {
    break;
  }
console.log(result);
}
// 出力:["叱る", index: 0, input: "叱る・𠮟る"]
// 出力:["𠮟る", index: 3, input: "叱る・𠮟る"]