正規表現オブジェクトを生成します。正規表現オブジェクトは、文字列のパターンマッチングを行う際に用いられます。次の例は、match() を用いて文字列 str が "DEF" という文字列を含んでいるかどうかを検査します。flags の詳細は フラグ を参照してください。
str = "ABCDEFG";
re = new RegExp("DEF", "ig");
console.log(re.test(str)); // => true
new RegExp() の代わりに、次のように生成することもできます。
str = "ABCDEF";
re = /DEF/ig;
console.log(re.test(str)); // => true
マッチングを行い、マッチした部分文字列(g フラグ指定時は配列)を返します。exec() で str を省略した場合は、RegExp.input で指定された文字列に対してマッチングを行います。
re = /[0-9]+/; console.log(re.exec("abc123")); // => 123 console.log("abc123".match(re)); // => 123
マッチングを行い、マッチしたかどうかを真偽値で返します。
re = /[0-9]+/;
console.log(re.test("abc123")); // => true
高速化のために、正規表現をあらかじめ内部表現形式にコンパイルするのに用いられていました。現在では使用されていません。
re = new RegExp(""); re.compile("[0-9]+"); for (var i = 0; i < 1000; i++) { if (str.match(re)) { : } }
ES2020 で追加された新しい機能で、文字列 str の中から regexp にマッチするものをリスト(正確にはイテレーター)で返却します。
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]
正規表現では、次のようなマッチング表現を用いることができます。詳細は「とほほの正規表現入門」を参照してください。
正規表現 | 意味 |
---|---|
x | xという文字。 |
xyz | x, y, z がこの順番で出現する場合にマッチ。 |
[xyz] | x、y、zのいずれか1文字。 |
[x-z] | x~zまでのいずれか1文字。 |
[^xyz] | x、y、zのいずれでもない任意の1文字 |
. | 任意の1文字。Line Feed(\n), Carriage Return(\r), Line Separator(\u2028), Paragraph Separator(\u2029) を除く任意の1文字。 |
abc|xyz | abc または xyz。 |
^x | xで始まる文字列 |
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)y | x に続いて y が現れる場合、y にマッチ。(ES2018~) |
(?<!x)y | x に続いて y が現れない場合、y にマッチ。(ES2018~) |
バックスラッシュ(\)に続く文字は特別な意味を持ちます。
表現 | 意味 |
---|---|
\0 | NUL 文字。 |
\b | 単語の区切り文字。 |
\B | \b以外の文字 |
\cX | Ctrl-X。X には A-Z の何れかの文字が入る。 |
\d | 半角数字。[0-9]と同じ。 |
\D | \d 以外の文字。[^0-9]と同じ。 |
\f | 改ページ(FF:Form-feed)。 |
\n | 改行文字(LF:Line feed)。 |
\r | 復帰文字(CR:Carriage return)。 |
\s | 1文字の区切り文字。空白文字( )、改ページ(\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_]と同じ。 |
\n | n番目の (...) にマッチした文字列 |
\ohhh | 8進数で hhh の文字。(非推奨) |
\xhh | 16進数で hh の文字 |
\uhhhh | UTF-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 と指定します。
フラグ | フラグ名 | 意味 |
---|---|---|
g | global | 2番目、3番目... にマッチする部分も検索する |
i | ignoreCase | 大文字・小文字を区別しない |
m | multiline | 複数行に対して検索する |
u | unicode | Unicodeのサロゲーションペア文字も1文字として扱う |
y | sticky | lastIndex で指定した位置からのみ検索する |
s | dotAll | ピリオド(.)が CR, LF, U+2028, U+2029 を含め、すべての文字にマッチする (ES2018~) |
d | hasIndices | マッチ文字列の先頭・終了インデックスを返却する (ES2022~) |
g フラグを指定すると最初にマッチした部分に加え、2番目、3番目...にマッチした部分も配列として返します。
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 番目以降の文字に対して行われます。下記の様に、ループ処理することも可能です。
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 フラグを指定すると大文字小文字を区別しなくなります。
"abc".match(/ABC/) // マッチしない "abc".match(/ABC/i) // マッチする;
m フラグを指定すると、行頭(^)や行末($)のマッチングが文字列の先頭・末尾だけではなく、各行の行頭・行末にもマッチするようになります。
"123\n456\n789".match(/^456/) // マッチしない "123\n456\n789".match(/^456/m) // マッチする
u フラグを指定すると、U+10000 以上のサロゲーションペア領域の文字に対しても、1文字とみなすようになります。
"🍔".match(/^.$/) // 2文字とみなすのでマッチしない "🍔".match(/^.$/u) // マッチする
y フラグを指定すると、lastIndex の位置からから先頭マッチングします。
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~)
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個目のマッチ文字列の開始・終了インデックス
フラグを示す文字列を返します。
re = /DEF/gi;
console.log(re.flags); // => "gi"
global は g フラグ、ignoreCase は i フラグ、multiline は m フラグ、unicode は u フラグ、sticky は y フラグ、dotAll は s フラグ、hasIndices は d フラグが指定されているか否かを返します。
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() の第一引数や /.../ で指定したパターン文字列を返します。
reg = /[a-z]+/i;
console.log(reg.source); // => "[a-z]+"
g フラグが有効な場合に利用可能で、test() や exec() でマッチした部分の次の位置を返します。最初の文字の位置を 0 とします。再度 test() や exec() を行うと、lastIndex の位置を先頭としてマッチングを行います。
var re = /123/g;
var str = 'abc123def';
re.test(str);
console.log(re.lastIndex); // => 6
RegExp.$記号 の形式は、それぞれ以下の意味を持ちますが、現在では非推奨です。
表現 | 意味 |
---|---|
RegExp.$n | n番目の括弧に対応する文字列。下記参照。 |
RegExp.$& | RegExp.lastMatch と同意。 |
RegExp.$` | RegExp.leftContext と同意。 |
RegExp.$" | RegExp.rightContext と同意。 |
RegExp.$+ | RegExp.lastParen と同意。 |
RegExp.$_ | RegExp.input と同意。 |
RegExp.$* | RegExp.multiline と同意。 |
正規表現内に (...) を指定すると、RegExp.$n で (...) に対応する部分を取り出すことができます。
"12:34:56".match(/(\d+):(\d+):(\d+)/); console.log(RegExp.$1); // => 12 console.log(RegExp.$2); // => 34 console.log(RegExp.$3); // => 56
直前のマッチングにおいて、lastMatch は最後にマッチした文字列、leftContext はマッチした部分よりも左側の文字列、rightContext は右側の文字列、lastParen は最後の (...) に対応する文字列を返します。lastMatch、leftContext、rightContext、lastParen はそれぞれ、$&、$`、$'、$+ の省略形を用いることもできます。
"abc123def".match(/(123)/); console.log(RegExp.lastMatch); // => 123 console.log(RegExp.leftContext); // => abc console.log(RegExp.rightContext); // => def console.log(RegExp.lastParen); // => 123
最後にマッチした際に、マッチングの対象とした文字列を示します。$_ と同義です。
var re = /123/g; re.test("abc123def"); console.log(RegExp.input); // => "abc123def" re.test("abc456def"); // マッチしないので index は変化しない console.log(RegExp.input); // => "abc123def"
ES2018(ES9) で追加された機能で、正規表現のマッチング時に (?<名前>パターン) の様に記述しておくと、マッチングの戻り値の groups.名前 でマッチした文字列を参照できるようになります。
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