7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

un-T factory! XAAdvent Calendar 2017

Day 12

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

Last updated at Posted at 2017-12-12

#正規表現の考え方
【半角英数字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文字以上の半角英数字(数字だけは不可)

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

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?