正規表現(RegExp)

目次

正規表現オブジェクト

regexp = new RegExp(patern[, flags])

正規表現オブジェクトを生成します。正規表現オブジェクトは、文字列のパターンマッチングを行う際に用いられます。次の例は、match() を用いて文字列 str が "DEF" という文字列を含んでいるかどうかを検査します。flags の詳細は フラグ を参照してください。

JavaScript
str = "ABCDEFG";
re = new RegExp("DEF", "ig");
console.log(re.test(str));         // => true

regexp = /pattern/flags

new RegExp() の代わりに、次のように生成することもできます。

JavaScript
str = "ABCDEF";
re = /DEF/ig;
console.log(re.test(str));         // => true

マッチング

str.match(regexp)

str に対して正規表現 regexp でマッチングを行い結果を返します。マッチしなかった場合は null を返します。

JavaScript
const ret = "abc123".match(/[0-9]+/);
console.log(ret);       // => ['123', index:3, input:'abc123', groups:undefined]
console.log(ret[0]);    // マッチした文字列: '123'
console.log(ret.index); // 見つかった場所のインデックス: 3
console.log(ret.input); // 入力文字列: 'abc123'

グローバルフラグ(g) を指定した場合はマッチした部分文字列の配列を返します。マッチしなかった場合は null を返します。

const ret = "abc123def456".match(/[0-9]+/g);
console.log(ret);                             // ['123', '456']

regexp.exec(str)

str に対して正規表現 regexp でマッチングを行い結果を返します。グローバルフラグ(g) を指定した場合はマッチした部分文字列の配列を返します。マッチしなかった場合は null を返します。str を省略した場合は、RegExp.input で指定された文字列に対してマッチングを行います。

JavaScript
const re = /[0-9]+/;
const ret = re.exec("abc123");
console.log(ret);       // => ['123', index:3, input:'abc123', groups:undefined]
console.log(ret[0]);    // マッチした文字列: '123'
console.log(ret.index); // 見つかった場所のインデックス: 3
console.log(ret.input); // 入力文字列: 'abc123'

regexp.test(str)

マッチングを行い、マッチしたかどうかを真偽値で返します。

JavaScript
const re = /[0-9]+/;
console.log(re.test("abc123"));        // => true

regexp.compile(patern[, flag]) (非推奨)

高速化のために、正規表現をあらかじめ内部表現形式にコンパイルするのに用いられていました。現在では使用されていません。

JavaScript
const re = new RegExp("");
re.compile("[0-9]+");
for (var i = 0; i < 1000; i++) {
  if (str.match(re)) {
    :
  }
}

str.matchAll(regexp)

ES2020 で追加された新しい機能で、文字列 str の中から regexp にマッチするものをリスト(正確にはイテレーター)で返却します。

JavaScript
for (var m of "2020-12-31".matchAll(/[0-9]+/g)) {
  console.log(m);
}
// => ["2020", index: 0, input: "2020-12-31", groups: undefined]
// => ["12", index: 5, input: "2020-12-31", groups: undefined]
// => ["31", index: 8, input: "2020-12-31", groups: undefined]

正規表現の文法

正規表現では、次のようなマッチング表現を用いることができます。詳細は「とほほの正規表現入門」を参照してください。

正規表現 意味
xxという文字。
xyzx, y, z がこの順番で出現する場合にマッチ。
[xyz]xyzのいずれか1文字。
[x-z]xzまでのいずれか1文字。
[^xyz]xyzのいずれでもない任意の1文字
.任意の1文字。Line Feed(\n), Carriage Return(\r), Line Separator(\u2028), Paragraph Separator(\u2029) を除く任意の1文字。
abc|xyzabc または xyz
^xxで始まる文字列
x$xで終わる文字列
x*0文字以上のx。最大マッチング。
x+1文字以上のx。最大マッチング。
x?0文字または1文字のx。最大マッチング。
x{n}n個のx。最大マッチング。
x{n,}n個以上のx。最大マッチング。
x{n,m}n個~m個のx。最大マッチング。
x*?0文字以上のA。最少マッチング。
x+?1文字以上のA。最少マッチング。
x??0文字または1文字のx。最少マッチング。
x{n}?n個のx。最少マッチング。
x{n,}?n個以上のx。最少マッチング。
x{n,m}?n個~m個のx。最少マッチング。
[\b]バックスペース
(?:x)xという文字。ただし、$1...$n の参照から除外される。
x(?=y)x に続いて y が現れる場合、x にマッチ
x(?!y)x に続いて y が現れない場合、x にマッチ
(?<=x)yx に続いて y が現れる場合、y にマッチ。(ES2018~)
(?<!x)yx に続いて y が現れない場合、y にマッチ。(ES2018~)
(?flag:x)i, s, m などのフラグを x のみに部分的に適用する。(ES2025~)
(?-flag:x)i, s, m などのフラグを x のみに部分的に適用除外する。(ES2025~)

バックスラッシュ(\)に続く文字は特別な意味を持ちます。

表現 意味
\0NUL 文字。
\b単語の区切り文字。
\B\b以外の文字
\cXCtrl-XX には A-Z の何れかの文字が入る。
\d半角数字。[0-9]と同じ。
\D\d 以外の文字。[^0-9]と同じ。
\f改ページ(FF:Form-feed)。
\n改行文字(LF:Line feed)。
\r復帰文字(CR:Carriage return)。
\s1文字の区切り文字。空白文字( )、改ページ(\f)、改行(\n)、ラインフィード(\r)、タブ文字(\r)、垂直タブ(\v)、No-break space(\u00a0)、Ogham space mark(\u1680)、Mongolian vowel separator(\u180e)、Xxx Quad(\u2000-\u2001)、Xxx Space(\u2002-\u200a)、Line separator(\u2028)、Paragraph separator(\u2029)、Narrow no-break space(\u202f)、Medium mathematical space(\u205f)、全角スペース(\u3000)、BOM(\ufeff) いずれかの 1文字。[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] と同じ。
\S\s以外の1文字
\t水平タブ(HT:Horozontal tab)。
\v垂直タブ(VT:Vertical tab)。
\wアンダーバー(_)を含む半角英数文字。[A-Za-z0-9_]と同じ。
\W\w以外の文字。[^A-Za-z0-9_]と同じ。
\nn番目の (...) にマッチした文字列
\ohhh8進数で hhh の文字。(非推奨)
\xhh16進数で hh の文字
\uhhhhUTF-16 Unicode文字。
\u{hhhh}g フラグ指定時のみ利用可能。非サロゲートペア領域の UTF-16 Unicode文字。
\u{hhhhh}g フラグ指定時のみ利用可能。サロゲートペア領域の UTF-16 Unicode文字。
\p{property}Unicodeで、Binaryプロパティに propety を持つ文字。(要 uフラグ) (ES2018~)
\p{gc=property}Unicodeで、General_Category に propety を持つ文字。(要 uフラグ) (ES2018~)
\p{sc=property}Unicodeで、Script が propety にマッチする文字。(要 uフラグ) (ES2018~)
\p{scx=property}Unicodeで、Script_Extensions が propety にマッチする文字。(要 uフラグ) (ES2018~)
\P{property}Unicodeで、Binaryプロパティに propety を持たない文字。(要 uフラグ) (ES2018~)
\P{gc=property}Unicodeで、General_Category に propety を持たない文字。(要 uフラグ) (ES2018~)
\P{sc=property}Unicodeで、Script が propety にマッチしない文字。(要 uフラグ) (ES2018~)
\P{scx=property}Unicodeで、Script_Extensions が propety にマッチしない文字。(要 uフラグ) (ES2018~)
\その他その他の文字自身

\p{...} は ES2018(ES9) で追加された機能で、例えばひらがなににマッチする文字は \p{sc=Hiragana} と指定します。

フラグ

RegExp() の第2引数や /.../ の後ろに記述する i、g、m などのフラグは下記のような意味を持ちます。i と g の両方を指定する時は ig と指定します。

フラグフラグ名意味
gglobal2番目、3番目... にマッチする部分も検索する
iignoreCase大文字・小文字を区別しない
mmultiline複数行に対して検索する
sdotAllピリオド(.)が CR, LF, U+2028, U+2029 を含め、すべての文字にマッチする (ES2018~)
ystickylastIndex で指定した位置からのみ検索する
dhasIndicesマッチ文字列の先頭・終了インデックスを返却する (ES2022~)
uunicodeUnicodeのサロゲートペア領域の文字も1文字として扱う (ES2015~)
vunicodeUnicodeの結合文字も1文字として扱う (ES2024~)

グローバルフラグ(g)

g フラグを指定すると最初にマッチした部分に加え、2番目、3番目...にマッチした部分も配列として返します。

JavaScript
res = "12:34:56".match(/\d+/g);
console.log(res.length);     // => 3
console.log(res[0]);         // => "12"
console.log(res[1]);         // => "34"
console.log(res[2]);         // => "56"

g フラグによるマッチングは、lastIndex 番目以降の文字に対して行われます。下記の様に、ループ処理することも可能です。

JavaScript
var str = "A123 A456 A789";
var re = /A[0-9]+/g;
while (re.exec(str)) {
  console.log(re.lastIndex);         // => 4, 9, 14
  console.log(RegExp.lastMatch);     // => "A123", "A456", "A789"
}

大文字・小文字無視フラグ(i)

i フラグを指定すると大文字小文字を区別しなくなります。

JavaScript
"abc".match(/ABC/)     // マッチしない
"abc".match(/ABC/i)    // マッチする;

マルチラインフラグ(m)

m フラグを指定すると、行頭(^)や行末($)のマッチングが文字列の先頭・末尾だけではなく、各行の行頭・行末にもマッチするようになります。

JavaScript
"123\n456\n789".match(/^456/)        // マッチしない
"123\n456\n789".match(/^456/m)       // マッチする

シングルラインフラグ(s)

s フラグを指定すると文字列全体をシングルラインとみなし、ピリオド(.)が改行コード系の CR, LF, U+2028, U+2029 を含め、すべての文字にマッチするようになります。ES2018 から使用可能です。

"ABC\nDEF".match(/^.*$/)           // マッチしない
"ABC\nDEF".match(/^.*$/s)          // マッチする

スティッキーフラグ(y)

y フラグを指定すると、lastIndex の位置からから先頭マッチングします。

JavaScript
reg = /A/y;
reg.lastIndex = 0; console.log(reg.test("A1A2A3"));        // => true
reg.lastIndex = 1; console.log(reg.test("A1A2A3"));        // => false
reg.lastIndex = 2; console.log(reg.test("A1A2A3"));        // => true

先頭・末尾インデックスを返却する(d)

d フラグを指定すると、indices でマッチした文字列の開始・終了インデックスを得ることができるようになります。(ES2022~)

JavaScript
var result = "My name is Yamada".match(/My name is (.*)/d);
console.log(result.indices[0]);  // [0, 17] 文字列全体の開始・終了インデックス
console.log(result.indices[1]);  // [11, 17] 1個目のマッチ文字列の開始・終了インデックス

Unicodeフラグ(u)

u フラグを指定すると、U+10000 以上のサロゲートペア領域の文字に対しても、1文字とみなすようになります。

JavaScript
"🍔".match(/^.$/)         // 2文字とみなすのでマッチしない
"🍔".match(/^.$/u)        // マッチする

Unicodeセットフラグ(v)

u フラグだけではサロゲートペア領域の文字には対応できますが、結合文字 には対応できませんでした。ES2024 で v フラグが追加され、\p{RGI_Emoji} などと組み合わせることで、結合文字も1文字とみなすようになりました。

JavaScript
"😵‍💫".match(/^\p{Emoji}$/u)        // 結合文字に対してはマッチしない
"😵‍💫".match(/^\p{RGI_Emoji}$/v)    // マッチする

v フラグはまた、正規表現の差集合、積集合、ネストをサポートします。[A--B]A から B を除いた差集合を意味します。下記では ASCII 文字から数字を除外した文字にマッチします。

"5".match(/[\p{ASCII}]/v)              // "5" はASCIIなのでマッチする
"A".match(/[\p{ASCII}--\p{Number}]/v)  // ASCIIであっても数字はマッチしない

[A&&B]A であり、かつ B である積集合を意味します。下記では数字であり、かつ、ASCII 文字である文字にマッチします。

"5".match(/[\p{Number}]/v)             // 全角文字でも数字なのでマッチする
"5".match(/[\p{Number}&&\p{ASCII}]/v)  // 数字であってもASCIIではないのでマッチしない

また、下記の様に [...] をネストできるようになりました。

"A".match(/[[A-Z][a-z][0-9]]/v)   // A-Z と a-z と 0-9
"A".match(/[\p{ASCII}--[0-9]]/v)  // ASCII から 0-9 を除いたもの

regexp.flags

フラグを示す文字列を返します。

JavaScript
re = /DEF/gi;
console.log(re.flags);       // => "gi"

regexp.global

regexp.ignoreCase

regexp.multiline

regexp.sticky

regexp.dotAll

regexp.hasIndices

regexp.unicode

regexp.unicodeSets

global は g フラグ、ignoreCase は i フラグ、multiline は m フラグ、sticky は y フラグ、dotAll は s フラグ、hasIndices は d フラグ、unicode は u フラグ、unicodeSets は v フラグが指定されているか否かを返します。

JavaScript
re = /DEF/gi;
console.log(re.global);       // => true
console.log(re.ignoreCase);   // => true
console.log(re.multiline);    // => false
console.log(re.sticky);       // => false
console.log(re.unicode);      // => false
console.log(re.unicodeSets);  // => false

マッチングの結果

regexp.source

RegExp() の第一引数や /.../ で指定したパターン文字列を返します。

JavaScript
reg = /[a-z]+/i;
console.log(reg.source);        // => "[a-z]+"

regexp.lastIndex

g フラグが有効な場合に利用可能で、test()exec() でマッチした部分の次の位置を返します。最初の文字の位置を 0 とします。再度 test() や exec() を行うと、lastIndex の位置を先頭としてマッチングを行います。

JavaScript
var re = /123/g;
var str = 'abc123def';
re.test(str);
console.log(re.lastIndex);   // => 6

RegExp.$記号 (非推奨)

RegExp.$記号 の形式は、それぞれ以下の意味を持ちますが、現在では非推奨です。

表現 意味
RegExp.$nn番目の括弧に対応する文字列。下記参照。
RegExp.$&RegExp.lastMatch と同意。
RegExp.$`RegExp.leftContext と同意。
RegExp.$"RegExp.rightContext と同意。
RegExp.$+RegExp.lastParen と同意。
RegExp.$_RegExp.input と同意。
RegExp.$*RegExp.multiline と同意。

RegExp.$n (非推奨)

正規表現内に (...) を指定すると、RegExp.$n で (...) に対応する部分を取り出すことができます。

JavaScript
"12:34:56".match(/(\d+):(\d+):(\d+)/);
console.log(RegExp.$1);   // => 12
console.log(RegExp.$2);   // => 34
console.log(RegExp.$3);   // => 56

RegExp.lastMatch (非推奨)

RegExp.leftContext (非推奨)

RegExp.rightContext (非推奨)

RegExp.lastParen (非推奨)

直前のマッチングにおいて、lastMatch は最後にマッチした文字列、leftContext はマッチした部分よりも左側の文字列、rightContext は右側の文字列、lastParen は最後の (...) に対応する文字列を返します。lastMatch、leftContext、rightContext、lastParen はそれぞれ、$&$`$'$+ の省略形を用いることもできます。

JavaScript
"abc123def".match(/(123)/);
console.log(RegExp.lastMatch);    // => 123
console.log(RegExp.leftContext);  // => abc
console.log(RegExp.rightContext); // => def
console.log(RegExp.lastParen);    // => 123

RegExp.input (非推奨)

最後にマッチした際に、マッチングの対象とした文字列を示します。$_ と同義です。

JavaScript
var re = /123/g;
re.test("abc123def");
console.log(RegExp.input);         // => "abc123def"
re.test("abc456def");              // マッチしないので index は変化しない
console.log(RegExp.input);         // => "abc123def"

名前付きキャプチャグループ

ES2018(ES9) で追加された機能で、正規表現のマッチング時に (?<名前>パターン) の様に記述しておくと、マッチングの戻り値の groups.名前 でマッチした文字列を参照できるようになります。

JavaScript
var str = "2019年12月31日";
var result = str.match(/(?<year>\d+)年(?<month>\d+)月(?<day>\d+)日/);
console.log(result.groups.year);      // 2019
console.log(result.groups.month);     // 12
console.log(result.groups.day);       // 31

同じ名前が複数回出現するとエラーとなっていましたが、ES2025 以降はエラーにならなくなりました。下記の例は YYYY-MM 形式にも MM-YYYY 形式にも対応するキャプチャグループの例です。

JavaScript
str.match(/(?<year>[0-9]{4})-(?<month>[0-9]{2})|(?<month>[0-9]{2})-(?<year>[0-9]{4})/)

その他

RegExp.escape(str)

ES2025 で追加されました。str に含まれる正規表現のメタ文字を無効化します。具体的には、空白文字、アンダースコア(_)を除く記号文字、および、安全のため最初の1文字をエスケープします。エスケープは -\x2d の様に16進数にエスケープするものと、?\? のように \ を付与してエスケープするものがあります。

JavaScript
RegExp.escape("Are you OK?")     // "\x41re\x20you\x20OK\?"