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

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

メモ

  • 正規表現での検索等を行うオブジェクト
  • 正規表現リテラルも同等の処理が可能 (一時的に RegExp【正規表現】オブジェクト を作成)
  • Eメールアドレス等の正規表現の例:正規表現パターン例
  • 正規表現の指定が可能なその他のオブジェクト・メソッド:
  • 処理時間のかかる正規表現に注意
    • ネスト:(例) /^([0-9]+)*$/ に対して "9~9#"
    • 重複:(例) /(x|xx)+/
    • 文字長の制限なし

コンストラクタ

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

プロパティ

を参照
プロパティ説明
RegExp.$1 ~ $9 グループ化で保存された部分文字列 (正規表現パターン参照)
RegExp[ @@species ] コンストラクタ定義 (実装:[Symbol.species])
RegExp.prototype.constructorコンストラクタ定義
RegExp.prototype.flags 検索フラグ ("gimyu" の内で使用している検索フラグの文字列)
RegExp.prototype.global 'g'(グローバル検索) フラグ使用有無 (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 ] [ @@match ]【検索 (詳細)】メソッド
正規表現判定 (Boolean 型)
(実装:[Symbol.match])
正規表現判定:falseの場合、下記メソッドの例外を回避
String.startsWith【開始文字列判定】
String.endsWith【終了文字列判定】
String.includes【部分文字列判定】
RegExp.prototype[ @@replace ] [ @@replace ]【置換 (関数指定可)】メソッド (実装:[Symbol.replace])
RegExp.prototype[ @@search ] [ @@search ] 【検索 (簡易)】メソッド (実装:[Symbol.search])
RegExp.prototype[ @@split ] [ @@split ]【分割】メソッド (実装:[Symbol.split])

メソッド

メソッド説明
RegExp.prototype[ @@match ] ( string ) 検索 (詳細) (実装:[Symbol.match])
RegExp.prototype [ @@replace ] ( string, replaceValue ) 置換 (関数指定可) (実装:[Symbol.replace])
RegExp.prototype [ @@search ] ( string ) 検索 (簡易) (実装:[Symbol.search])
RegExp.prototype[ @@split ] ( string, limit ) 分割 (実装:[Symbol.split])
RegExp.prototype.compile (pattern, flags ) コンパイル
RegExp.prototype.exec ( string )検索
RegExp.prototype.test ( string ) 検索評価
RegExp.prototype.toString () 文字列変換

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

正規表現の指定が可能なその他のオブジェクト・メソッド
オブジェクトメソッド説明
String【文字列】オブジェクト match ( regexp )正規表現検索 (詳細)
replace ( searchValue, replaceValue ) 置換 (正規表現可・関数指定可)
search ( regexp )正規表現検索 (簡易)
split ( [separator [, limit]] )分割 (正規表現可)

検索フラグ

検索フラグプロパティ説明
gglobal グローバル検索 ( lastIndex【次回検索の開始位置】プロパティを使用し、次回の処理に利用)
iignoreCase 大文字小文字の区別なし
mmultiline 複数行の検索 (^・$ を行頭・行末とみなす)
uunicode Unicode対応 (コードポイント値を使用し、サロゲートペア対応とする)
ysticky 検索開始位置固定 ( lastIndex【次回検索の開始位置】プロパティを開始位置に固定して処理)

正規表現パターン

正規表現パターン説明
^先頭 'm'(複数行検索) フラグが指定された場合、行頭
$末尾 'm'(複数行検索) フラグが指定された場合、行末
.行末文字以外の 1 文字
*直前のパターンの 0 回以上の繰り返し
+直前のパターンの 1 回以上の繰り返し
?直前のパターンの 0 回か 1 回
最短一致 (*、+、?、{} の直後に指定)
{n}直前のパターンの n 回の繰り返し (n:正数)
{n,}直前のパターンの n 回以上の繰り返し (n:正数)
{n,m} 直前のパターンの n 回 ~ m 回の繰り返し (nm:正数)
|パターンを区切り、どちらかのパターンと一致
[ 文字の集合 ]括弧で囲まれた文字 (-で範囲指定)
[ ^ 文字の集合 ]括弧で囲まれた文字以外 (-で範囲指定)
( パターン )後方参照ありのグループ化 ($1~$9に保存)
( ? = パターン2 )直前のパターンにパターン2が続く
( ? ! パターン2 )直前のパターンにパターン2が続かない
( ? : パターン )後方参照なしのグループ化 ($1~$9に保存なし)
$1 ~ $9グループ化で保存された部分文字列
\エスケープシーケンス
\b単語の区切り
\B単語の区切り以外
\d数字 ( '[0-9]' に相当 )
\D数字以外 ( '[^\d]' に相当 )
\f改ページ (\u000C:form feed)
\n改行 (\u000A:line feed)
\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 改行なし半角スペース (No-Break Space)
\u1680
\u180E
\u2000En Quad
\u2001Em Quad
\u2002 En Space
\u2003 Em Space
\u2004Three-Per-Em Space
\u2005Four-Per-Em Space
\u2006Six-Per-Em Space
\u2007Figure Space
\u2008Punctuation Space
\u2009 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]
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])?)*$/

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: "叱る・𠮟る"]