Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

32文字以下かつアンダースコアを1つ以上含む文字列を正規表現で判定する方法

さて、タイトルにある通りです。「32文字以下かつアンダースコアを1つ以上含むか」を正規表現だけで判定してみましょう!

(もちろん str.length <= 32 && str.includes('_') で判定できるしそうすべきなので、この記事に実用性はありません)

解答:

さて早速解答です。こちらになります。

/^(?=.{0,31}_).{0,32}$/

ポイントは肯定先読み(lookahead)です。肯定先読みを使うことで、「直後に任意の文字が0個以上31個以下とアンダースコアが続く位置」を指定できます。あとはその位置から後ろが32文字以下であると確かめれば完璧です。

さらに: アンダースコアをちょうど1文字だけ含む場合

先程はアンダースコアが1つ以上という条件でしたが、今度はより難易度を上げてアンダースコアがちょうど1個だけのケースです。

/^(?=.{0,32}$)[^_]*_[^_]*$/

腹立つ絵文字みたいになりました。

今度はあらかじめ肯定先読みを使って「32文字以下である」と確定させています。その後ろの部分で _ が1つしかないかどうか調べています。