さて、タイトルにある通りです。「32文字以下かつアンダースコアを1つ以上含むか」を正規表現だけで判定してみましょう!
(もちろん str.length <= 32 && str.includes('_')
で判定できるしそうすべきなので、この記事に実用性はありません)
解答:
さて早速解答です。こちらになります。
/^(?=.{0,31}_).{0,32}$/
ポイントは肯定先読み(lookahead)です。肯定先読みを使うことで、「直後に任意の文字が0個以上31個以下とアンダースコアが続く位置」を指定できます。あとはその位置から後ろが32文字以下であると確かめれば完璧です。
さらに: アンダースコアをちょうど1文字だけ含む場合
先程はアンダースコアが1つ以上という条件でしたが、今度はより難易度を上げてアンダースコアがちょうど1個だけのケースです。
/^(?=.{0,32}$)[^_]*_[^_]*$/
腹立つ絵文字みたいになりました。
今度はあらかじめ肯定先読みを使って「32文字以下である」と確定させています。その後ろの部分で _
が1つしかないかどうか調べています。