なんとなくで使っていた正規表現。
一度ちゃんとまとめてみる。
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))