正規表現(RegExp)

[up] [prev] [next]

目次

正規表現オブジェクト

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

マッチング

regexp.exec(str)
str.match(regexp)

マッチングを行い、マッチした部分文字列(g フラグ指定時は配列)を返します。exec() で str を省略した場合は、RegExp.input で指定された文字列に対してマッチングを行います。

JavaScript
re = /[0-9]+/;
console.log(re.exec("abc123"));         // => 123
console.log("abc123".match(re));        // => 123
regexp.test(str)

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

JavaScript
re = /[0-9]+/;
console.log(re.test("abc123"));        // => true
regexp.compile(patern[, flag]) (非推奨)

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

JavaScript
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~)

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

表現 意味
\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複数行に対して検索する
uunicodeUnicodeのサロゲーションペア文字も1文字として扱う
ystickylastIndex で指定した位置からのみ検索する
sdotAllピリオド(.)が CR, LF, U+2028, U+2029 を含め、すべての文字にマッチする (ES2018~)
dhasIndicesマッチ文字列の先頭・終了インデックスを返却する (ES2022~)

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 フラグを指定すると大文字小文字を区別しなくなります。

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

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

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

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

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

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 フラグを指定すると、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個目のマッチ文字列の開始・終了インデックス
regexp.flags

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

JavaScript
re = /DEF/gi;
console.log(re.flags);       // => "gi"
regexp.global
regexp.ignoreCase
regexp.multiline
regexp.unicode
regexp.sticky
regexp.dotAll
regexp.hasIndices

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

JavaScript
re = /DEF/gi;
console.log(re.global);       // => true
console.log(re.ignoreCase);   // => true
console.log(re.multiline);    // => false
console.log(re.unicode);      // => false
console.log(re.sticky);       // => 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

[up] [prev] [next]
Copyright (C) 1996-2022 杜甫々
改訂版初版:2001年6月11日、最終更新:2022年7月3日
http://www.tohoho-web.com/js/regexp.htm