JavaScript
正規表現

肯定的先読みで「ある文字列を含むn字以上」の正規表現

正規表現の考え方

【半角英数字4文字以上のIDをご入力ください。数字だけのIDは不可。】
上記のケースを正規表現でどうすればよいか?
正規表現を考える場合、条件を細分化することが重要である。
今回のケースでは、半角英数字、繰り返しのパターン、文字列を含むの3つに分ける。

半角英数字

半角英数字を正規表現で書く場合、
[a-z]:半角英字(小文字)
[A-Z]:半角英字(大文字)
[0-9]:半角数字
上記の組み合わせで表現できる。

/[a-zA-Z0-9]/ // 半角英数字

ちなみに正規表現には\wというメタ文字がある。これは[a-zA-Z0-9_](半角英数字とアンダースコア)を意味する。

繰り返しのパターン

n回以上の繰り返し:{n,}
{n,}は直前の要素をn回以上繰り返す。

/[a-z]{4,}/ // 4文字以上の半角英字(小文字)を含む

先の半角英数字と組み合わせることで、4文字以上の半角英数字を表現できる。

/[a-zA-Z0-9]{4,}/ // 4文字以上の半角英数字

しかし、上記の組み合わせだけでは'0123'のような文字列でもマッチするため、
【数字だけのIDは不可】に対応できていない。

console.log(/[a-zA-Z0-9]{4,}/.test('0123'); // 結果:true

そこで肯定的先読みを利用することで対応できる。

文字列を含む

肯定的先読み

x(?=y)はxの後にyがあること意味する。

console.log(/j(?=avascript)/.exec('javascript')); // 結果:['j']
console.log(/j(?=avascript)/.exec('jquery')); // 結果:null

肯定的先読みを用いて『0文字以上のあらゆる文字の後に半角英数字がある』と書けば、
『半角英数字を含む』という正規表現にすることができる。
0文字以上のあらゆる文字は正規表現で.*と書くので、

/(?=.*[a-zA-Z])/ // 半角英数字を含む

よって、【数字だけのIDは不可】に下記の正規表現で対応できる。

console.log(/(?=.*[a-zA-Z])[a-zA-Z0-9]{4,}/.test('0123'); // 結果:false

あとは、文字列の位置を指定するアンカーで^(文字列の先頭)、$(文字列の末尾)囲めば完成!

/^(?=.*[a-zA-Z])[a-zA-Z0-9]{4,}$/ // 4文字以上の半角英数字(数字だけは不可)

まとめ

今回は、肯定的先読みを用いた正規表現を紹介しました。マッチさせたいパターンを細分化することで複雑な正規表現を比較的容易にすることができます。