Javascriptで正規表現のまとめ

なんとなくで使っていた正規表現。
一度ちゃんとまとめてみる。

sandbox
https://codepen.io/shnr/pen/ywwLej?editors=1111

表記

二通りある。

コンストラクタ表記

var regexp = new RegExp('ABC');

リテラル表記

var regexp = /ABC/

一般的にはリテラルのほうが好まれる。

検索の実行

exec()と、match()、2つの方法がある。

exec()

regexpオブジェクトのメソッド。

match()

Stringオブジェクトのmethod

var str = 'hogefuga';

console.log(/gefu/.exec(str))
console.log(str.match(/fuga/))

Options

g – グローバル検索
i – 大文字・小文字を区別しない
m – 複数行検索
y – 特定の位置から検索

指定方法

リテラルのほうがよく見られる気がする。

var regex = new RegExp('ABC', 'g')
// or
var regex = /ABC/g

sample

console.log('hoge_fuga_fuga'.match(/fuga/g))
console.log('hoge_fuga_fuga'.match(/FUGA/gi))
console.log('hoge\nfuga\nfuga'.match(/FUGA/m))

y オプション

yの開始位置はregexpオブジェクトでlastIndexを指定して使う。

var regex = /ABC/y;
regex.lastIndex = 1;
console.log('ABC'.match(regex))

Meta charactors

.

単一文字

console.log('ABC'.match(/./));
console.log('ABC'.match(/../g));
console.log('あ!.\ne4'.match(/./g)); // 改行はマッチしない

\w

文字や数字

console.log('Abc-gggre'.match(/\w/));
console.log('Abc-gggre'.match(/\w/g));
console.log('Abc-gggre'.match(/\w+/g));

\W

文字や数字以外
大文字は逆の意

console.log('Abc-gggre'.match(/\W/));
console.log('Abc-^&%#gggre'.match(/\W/g));
console.log('Abc-^&%#gggre_&%$#""'.match(/\W+/g));

\d

数字

conconsole.log('Ab46tghj3654'.match(/\d/));
console.log('Ab46tghj3654'.match(/\d+/));
console.log('Ab46tghj3654'.match(/\d+/g));

\D 数字以外

console.log('Ab46tghj3654'.match(/\D/));
console.log('Ab46tghj3654'.match(/\D+/));
console.log('Ab46tghj3654'.match(/\D+/g));

\n

改行

console.log('Ab46t\nghj3654'.match(/\n/));
console.log('Ab46t\nghj\n3654'.match(/\n/g));

\r

carriage return
つまりリターンキー。

console.log('Ab46t\rghj3654'.match(/\r/));

\t

タブ

\f

改ページ

\s

空白
空白には、(半角、全角・タブ・改行・改ページ)全てが含まれる。

console.log('abc\nd ef ああ\c test'.match(/\s/))
console.log('abc\nd ef ああ  test'.match(/\s+/g))

\S

空白以外

console.log('abc\nd ef ああ\c test'.match(/\S/))
console.log('abc\nd ef ああ  test'.match(/\S+/g))

\b

単語の境目=word boundary
つまり、\wでマッチする文字と、それ以外の文字との境目

console.log('this is test'.match(/\bis/g))
console.log('hoge&fuga&huga'.match(/\bh/g))
console.log('hoge&fuga&huga'.match(/\bh.../g))

\0

nullを検索出来るんだって、、
null=\u0000

console.log('\u0000'.match(/\0/))
console.log('hogefuga\u0000hoge'.match(/ga\0/))
console.log('hogefuga\u0000hoge\u0000'.match(/g.\0/g))

数量詞

^

先頭の検索

console.log('hogefuga'.match(/^hoge/))
console.log('hoge\nfuga'.match(/^ho|fu/g))

$

末尾

console.log('hogefuga'.match(/ga$/))
console.log('hogefuga'.replace(/ga$/, 'fu'))

(?=xxx)

先読み
大文字・小文字の統一などに使えそう

console.log('fuga Fuga fuGa'.replace(/fu(?=ga)/, 'Fu'))
console.log('fugaFuga hoGeFuga hogefuga'.replace(/hoge(?=fuga)/gi, 'Hoge'))

(?!xxx)

否定先読み
先読みの逆。

console.log('fugaFuga hoGeFuga hogefuga'.replace(/hoge(?!hoge)/gi, 'FUGA'))

{n}

繰り返しの検索
複数文字の場合は()で囲む

console.log('fugafugaaaaafuga'.match(/a{3}/))
console.log('fugafugaaaaafuga'.match(/(a){3}/))
console.log('fugafugafuga'.match(/(fuga){3}/))

{n,}

n回以上の繰り返し。

console.log('fugafugaaaaafuga'.match(/a{3,}/))
console.log('fugafugafuga'.match(/(fuga){2,}/))

{n,m}

n回以上、m回以下の繰り返し

console.log('fugafugaaaaafuga'.match(/a{2,4}/))
console.log('fugafugafugafugafuga'.match(/(fuga){2,4}/))

+

1回以上の繰り返し

console.log('fugafugaaaaafuga'.match(/a+/g))
console.log('fugafugaaaaafugannfugafuga'.match(/(fuga)+/g))

*

0回以上の繰り返し

console.log('fugafugaaaaafuga'.match(/fuga*/g))

?

0回もしくは一度の出現

console.log('fugahoge'.match(/fuga?hoge/))
console.log('fugagehohoge'.match(/fuga(geho)?hoge/))
console.log('fugahoge'.match(/fuga(geho)?hoge/))

|

OR検索

console.log('hogefuga'.match(/hoge(geho|fuga)/))
console.log('hogefugafuhahogegeho'.match(/hoge(geho|fuga)/g))

()

グループ化

console.log('hogefugafuhahogegeho'.match(/(hoge)/g))

ブラケット

[]

検索文字として使うには、エスケープ必要

console.log('hoge[fuga]fuhahogegeho'.match(/\[fuga\]/g))

[xx]

bracket内のいづれかの文字を検索

console.log('hogefuhahogegeho'.match(/[fuga]/g))

[^xx]

上の真逆

console.log('hogefuhahogegeho'.match(/[^fuga]/g))

[x-y]

特定の範囲の値を検索

console.log('abcdefghijklmn'.match(/[e-h]/g))
console.log('abcg234t534defghijk86745lmn'.match(/[3-5]/g))
console.log('abcg234t534defghijk86745lmn'.match(/[a-c3-5]/g))

[^x-y]

特定の範囲以外を検索
^は[の直後でなければ、意味をなさない

console.log('abcdefghijklmn'.match(/[^e-h]/g))
console.log('abcg234t534defghijk86745lmn'.match(/[^3-5]/g))
console.log('abcg234t534defghijk86745lmn'.match(/[^a-c3-5]/g))