今回は正規表現における「パターン」について見ていきましょう。
文字クラスやメタ文字など、すでに見てきたものですが、実際の書き方、動作を確認しながら学習してください。
一見、難しそうですが、実際にコードを書いみると理解しやすいと思います。
文字クラスのマッチ
文字クラスのマッチするパターンです。
途中のコードは省略しています。
文字列
let regexp = /abc/; abc abcde zxabc : true aac ac abddc : false
ドット
let regexp = /a.c/; abc adc aac zxabc :true ac abbc :false
[…]
let regexp = /a[bcd]e/; abe ace ade :true abce abcde : false
[0-9]
let regexp = /[0-9]/g; let test = 'abc4589def'; let test2 = test.match(regexp); console.log(test2); (4) ['4', '5', '8', '9']
[0123456789]と同じになります。
英数字にマッチするパターンとして良く使われるのが、[0-9a-zA-Z]という書き方です。
メタ文字
^
文字列の先頭にマッチします。
let regexp = /^abc/; console.log(regexp.test('abcd')); true console.log(regexp.test('aabcde')); false
$
文字列の最後にマッチします。
let regexp = /abc$/; console.log(regexp.test('abcdef')); false console.log(regexp.test('xzabc')); true
\b
単語の先頭、末尾にマッチします。
let regexp = /\babc/; console.log(regexp.test('abcdef')); true console.log(regexp.test('xzabc')); false
let regexp = /abc\b/; console.log(regexp.test('abcdef')); false console.log(regexp.test('zxabc')); true
\B
先頭と末尾以外にマッチします。
let regexp = /\Babc/; console.log(regexp.test('zxabcdef')); true console.log(regexp.test('abcdef')); false
let regexp = /abc\B/; console.log(regexp.test('abcdef')); true console.log(regexp.test('zxabc')); false
*
0回以上連続する場合にマッチします。
let regexp = /ab*c/; console.log(regexp.test('ac')); true console.log(regexp.test('abc')); true console.log(regexp.test('abbc')); true
+
1回以上連続する場合にマッチします。
let regexp = /ab+c/; console.log(regexp.test('ac')); false console.log(regexp.test('abc')); true console.log(regexp.test('abbc')); true
?
0回、または1回の場合マッチします。
let regexp = /ab?c/; console.log(regexp.test('ac')); console.log(regexp.test('abc')); true true console.log(regexp.test('abbc')); false
{num}
指定した回数繰り返した場合マッチします。
let regexp = /ab{2}c/; console.log(regexp.test('ac')); console.log(regexp.test('abc')); false false console.log(regexp.test('abbc')); true
{num,}
指定回数以上の場合マッチします。
let regexp = /ab{2,}c/; console.log(regexp.test('abc')); console.log(regexp.test('abbc')); console.log(regexp.test('abbbbc')); false true true
{min,max}
何回以上何回以下の場合マッチします。
let regexp = /ab{2,4}c/; console.log(regexp.test('abc')); console.log(regexp.test('abbbbc')); console.log(regexp.test('abbbbbc')); false true false
組み合わせ
let regexp = /[0-9]{3}-[0-9]{4}-[0-9]{4}/; console.log(regexp.test('090-1234-5678')); console.log(regexp.test('03-1234-5678')); true false
量指定子
let regexp = /a.*c/; let gree = 'abbccdefgjiaggjfirkccfkgi'; let greed = gree.match(regexp); console.log(greed[0]); abbccdefgjiaggjfirkcc
量指定子は、デフォルトでは、より多くの文字列にマッチします。
ここでは「abbcc」ではなく、「abbccdefgjiaggjfirkcc」を取得しています。
let regexp = /a.*?c/; let gree = 'abbccdefgjiaggjfirkccfkgi'; let greed = gree.match(regexp); console.log(greed[0]); abbc
最小のマッチを取得するには、「?」を記述します。
いずれかにマッチ
let regexp = /tennis|swimming|football/; console.log(regexp.test('football')); console.log(regexp.test('tennis')); console.log(regexp.test('baseball')); true true false
先読みと後読み
先読み(肯定)
let money = ' I have 3 coins and 10€.'; let sample = money.match(/\d+(?=€)/); console.log(sample[0]); 10
X(?=Y)で記述します。
先読み(否定)
let money = ' I have 3 coins and 10€.'; let sample = money.match(/\d+(?!€)/); console.log(sample[0]); 3
X(?!Y)で記述します。
後読み(肯定)
let money = ' I have 3 coins and €100.'; let sample = money.match(/(?<=€)\d+/); console.log(sample[0]); 100
(?<=Y)Xで記述します。
後読み否定
let money = ' I have 3 coins and €100.'; let sample = money.match(/(?<!€)\d+/); console.log(sample[0]); 3
(?<!Y)Xで記述します。
あとがき
もの凄くシンプルですが、正規表現のパターンについてご紹介させて頂きました。
あとは、実際のコードを書きながら覚えて行くのが良いと思います。
今回も最後までお読み頂きありがとうございました。