RegExp【正規表現:Regular Expression】オブジェクト2015 (6) / 2018 (9) / 2020 (11) ~ 2022 (13)

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

メモ

概要

基本処理

注意事項

  • 処理時間のかかる正規表現に注意
    • ネスト:(例) /^([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.unicodeSets 'v'【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対応 (コードポイント値を使用し、サロゲートペア対応とする)
vunicodeSets Unicode対応 (拡張)
'u'【Unicode対応】フラグ を拡張
積集合 対応
差集合 対応
・バイナリ 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 パターン を区切り、どちらかの パターン と一致
パターンA&&パターンB 積集合パターンAかつパターンBのパターン ('v'【Unicode対応 (拡張)】フラグ 指定)
パターンA--パターンB 差集合パターンAからパターンBを除いたパターン ('v'【Unicode対応 (拡張)】フラグ 指定)
[文字の集合] 文字の集合 内の文字 (- で範囲指定)
[^文字の集合] 文字の集合 内の文字以外 (- で範囲指定)
(パターン) 後方参照ありのキャプチャ (後方参照:$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{プロパティ名} ※p1
\p{プロパティ値} ※p2
\p{プロパティ名=プロパティ値} ※p3
※p1:プロパティ名 を持つ Unicode文字
※p2:プロパティ値 を持つ Unicode文字 (※p3のプロパティ名省略形)
※p3:プロパティ名 の値が プロパティ値 である Unicode文字
('u'【Unicode対応】フラグ または 'v'【Unicode対応 (拡張)】フラグ 指定)
\P{プロパティ名} ※P1
\P{プロパティ値} ※P2
\P{プロパティ名=プロパティ値} ※P3

※P1:プロパティ名 を持たない Unicode文字
※P2:プロパティ値 を持たない Unicode文字 (※P3のプロパティ名省略形)
※P3:プロパティ名 の値が プロパティ値 でない Unicode文字
('u'【Unicode対応】フラグ または 'v'【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]' に相当 )

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

プロパティ名一覧

プロパティ値は 外部リンク を参照

プロパティ名・エイリアス正規プロパティ名備考
非バイナリ Unicode プロパティ名
General_CategoryGeneral_Category
gc
ScriptScript
sc
Script_ExtensionsScript_Extensions
scx
バイナリ Unicode プロパティ名
ASCIIASCII
ASCII_Hex_DigitASCII_Hex_Digit 16 進数 ASCII文字〔参考:Hex_Digit
('0'~'9'・'A'~'F'・'a'~'f')
AHex
AlphabeticAlphabetic英字 (全角を含む)
Alpha
AnyAny
AssignedAssigned
Bidi_ControlBidi_Control
Bidi_C
Bidi_MirroredBidi_Mirrored
Bidi_M
Case_IgnorableCase_Ignorable
CI
CasedCased
Changes_When_CasefoldedChanges_When_Casefolded
CWCF
Changes_When_CasemappedChanges_When_Casemapped
CWCM
Changes_When_LowercasedChanges_When_Lowercased
CWL
Changes_When_NFKC_CasefoldedChanges_When_NFKC_Casefolded
CWKCF
Changes_When_TitlecasedChanges_When_Titlecased
CWT
Changes_When_UppercasedChanges_When_Uppercased
CWU
DashDash
Default_Ignorable_Code_PointDefault_Ignorable_Code_Point
DI
DeprecatedDeprecated
Dep
DiacriticDiacritic
Dia
EmojiEmoji絵文字
Emoji_ComponentEmoji_Component
EComp
Emoji_ModifierEmoji_Modifier
EMod
Emoji_Modifier_BaseEmoji_Modifier_Base
EBase
Emoji_PresentationEmoji_Presentation
EPres
Extended_PictographicExtended_Pictographic
ExtPict
ExtenderExtender
Ext
Grapheme_BaseGrapheme_Base
Gr_Base
Grapheme_ExtendGrapheme_Extend
Gr_Ext
Hex_DigitHex_Digit 16 進数文字 + 互換性の同等文字 (全角など)〔参考:ASCII_Hex_Digit
('0'~'9'・'A'~'F'・'a'~'f'・'0'~'9'・'A'~'F'・'a'~'f')
Hex
IDS_Binary_OperatorIDS_Binary_Operator
IDSB
IDS_Trinary_OperatorIDS_Trinary_Operator
IDST
ID_ContinueID_Continue
IDC
ID_StartID_Start
IDS
IdeographicIdeographic
Ideo
Join_ControlJoin_Control
Join_C
Logical_Order_ExceptionLogical_Order_Exception
LOE
LowercaseLowercase
Lower
MathMath
Noncharacter_Code_PointNoncharacter_Code_Point
NChar
Pattern_SyntaxPattern_Syntax
Pat_Syn
Pattern_White_SpacePattern_White_Space
Pat_WS
Quotation_MarkQuotation_Mark引用符 (「」・"" 等)
QMark
RadicalRadical表意文字
Regional_IndicatorRegional_Indicator
RI
Sentence_TerminalSentence_Terminal
STerm
Soft_DottedSoft_Dotted
SD
Terminal_PunctuationTerminal_Punctuation
Term
Unified_IdeographUnified_Ideograph
UIdeo
UppercaseUppercase
Upper
Variation_SelectorVariation_Selector
VS
White_SpaceWhite_Spaceホワイトスペース (全角スペースを含む)
space
XID_ContinueXID_Continue
XIDC
XID_StartXID_Start
XIDS
バイナリ Unicode 文字列プロパティ名 ('v'【Unicode対応 (拡張)】フラグ 指定のみ有効)
Basic_Emoji基本絵文字セット
Emoji_Keycap_Sequence絵文字 キーキャップ シーケンス セット
RGI_Emoji_Modifier_Sequence絵文字 修飾子 シーケンス セット
RGI_Emoji_Flag_Sequence絵文字 旗 シーケンス セット
RGI_Emoji_Tag_Sequence絵文字 タグ シーケンス セット
RGI_Emoji_ZWJ_Sequence絵文字 ZWJ(Zero Width Joiner:ゼロ幅接合子) シーケンス セット
RGI_Emoji絵文字セット

正規表現パターン例

検索対象正規表現パターン
数字[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]);
// 出力:ƒ RegExp() { [native code] }
console.log(RegExp.prototype);
// 出力:{dotAll: undefined, flags: '', global: undefined, hasIndices: undefined, exec: ƒ, …}

const regex = /([0-9]+)-([0-9]+)-([0-9]+)/;
console.log(regex.constructor);
// 出力:ƒ 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
const 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

const str = "AAA-bbb-CCC-ddd-EEE\nfff-GGG-hhh-III-jjj";
let i = 1;
while (true) {
  let 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 回目 ]
// 出力:(4) ['AAA-bbb-CCC', 'AAA', 'bbb', 'CCC', index: 0, input: 'AAA-bbb-CCC-ddd-EEE\nfff-GGG-hhh-III-jjj', groups: undefined]
// 出力: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 回目 ]
// 出力:(4) ['fff-GGG-hhh', 'fff', 'GGG', 'hhh', index: 20, input: 'AAA-bbb-CCC-ddd-EEE\nfff-GGG-hhh-III-jjj', groups: undefined]
// 出力: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'(検索開始位置固定) フラグ】
const str = "999aaaAAA";
const regex = /[a-z]+[A-Z]+/;
console.log(regex.test(str));
// 出力:true

const 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}
const str = "叱る・\u{20B9F}る"
console.log(str);
// 出力:叱る・𠮟る

// 𠮟 が2文字と認識
const regex = /.る/g;
while (true) {
  let result = regex.exec(str);
  if (result == null) {
    break;
  }
console.log(result);
}
// 出力:['叱る', index: 0, input: '叱る・𠮟る', groups: undefined]
// 出力:['\uDF9Fる', index: 4, input: '叱る・𠮟る', groups: undefined]

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