パスワードを作るときの正規表現(メモ用)


業務で正規表現が必要そうなので必要な範囲だけ学んだ。

今回やりたかったことは、半角英字小文字、半角英字大文字、半角数字、記号(?!-)を少なくとも2種類組み合わせてパスワードを作れているかということを正規表現で調べたかった。

方針としては、上記の2種類以上の組み合わせの正規表現のパターンを考えると15通り考えなければいけないので、「半角英字大文字小文字数字、記号のみで組み合わされている」かつ「1種類のみの文字列で構成されていない」という条件で考えることにした。
こうすることで正規表現を5通り書くだけで終わり、さらに複雑な表現を使わずにシンプルに書くことができる。

まず、半角英字大文字小文字数字、記号のみで組み合わされている場合の表現

const mixedRegexp = /^[a-zA-Z0-9!?-]+$/;
const regexpMixed = new RegExp(mixedRegexp);

次に必要な条件のうち1種類のみで構成されている正規表現

// 半角英字小文字のみ
const smallAlphabetOnly = /^[a-z]+$/g;
// 半角英字大文字のみ
const largeAlphabetOnly = /^[A-Z]+$/g;
// 数字のみ
const numberOnly = /^[0-9]+$/;
// 指定の記号のみ
const symbolOnly = /^[!?-]+$/;

const regexpSmall = new RegExp(smallAlphabetOnly);
const regexpLarge = new RegExp(largeAlphabetOnly);
const regexpNumber = new RegExp(numberOnly);
const regexpSymbol = new RegExp(symbolOnly);

あとはこれを組み合わせて終わり

const str = "1!*";
console.log(
  !regexpSmall.test(str) &&
    !regexpLarge.test(str) &&
    !regexpNumber.test(str) &&
    !regexpSymbol.test(str) &&
    regexpMixed.test(str)
);

10分ほどMDN読んでやってみただけなので間違っているかもしれません。
こうすればいいよっていう方法教えていただける方はコメントお願いします!