正規表現を使ったユーザ登録チェック

by yshrkn

JavaScript

// ---------------------------------------------
// ユーザ管理用モジュール
// ---------------------------------------------
var userManager = (function() {
  // ユーザ情報を格納するための配列
  var _users = [];

  /**
   * A. n個の記号が含まれているかを確認する関数
   */
  function hasSymbols(str, min) {
		var regex = new RegExp("[^a-zA-Z0-9]{" + min + ",}", "g");
    var symbols = regex.test(str);
    return symbols;
  }

  /**
   * B. n個の数字が含まれているかを確認する関数
   */
  function hasNumbers(str, min) {
		var regex = new RegExp("\\d{" + min + ",}", "g");
    var numbers = regex.test(str);
    return numbers;
  }

  /**
   * C. 既に登録済みかを確認する関数
   */
  function isRegistered(user) {
    var isUsedId = false;
    for (var i = 0, len = _users.length; i < len; i++) {
      if (_users[i].id === user.id) {
        isUsedId = true;
        break;
      }
    }
    return isUsedId;
  }

  /**
   * ユーザを登録するためのメソッドです。
   *
   * @param{Object} user ユーザオブジェクト
   */
  function add(user) {
    // A. 記号チェック
    var minSymbols = 2;
    if (!hasSymbols(user.id, minSymbols)) {
      throw new Error(minSymbols + '以上の記号が必要です。');
    }

    // B. 数字チェック
    var minNumbers = 2;
    if (!hasNumbers(user.id, minNumbers)) {
      throw new Error(minNumbers + '以上の数字が必要です。');
    }

    // C. 登録済みチェック
    if (isRegistered(user)) {
      throw new Error(user.id + "は既に登録されています。");
    }

    // 適切な場合は、ユーザを登録する
    _users.push(user);
  }

  // public API
  return {
    add: add
  };

}());


// ---------------------------------------------
// Main
// ---------------------------------------------
var users = [
 { id: 'taro17@', age: 48 }, 
 { id: 'taro17@%', age: 20 }, 
 { id: 'taro17@%', age: 26 }
];

// 複数のユーザを登録します。
//
// 【出力結果】
// 2個以上の記号が必要です。
// taro17@%を登録しました。
// taro17@%は既に登録されています。
users.forEach(function(user) {
  try {
    userManager.add(user);
    console.log(user.id + 'を登録しました。');
  } catch (error) {
    console.warn(error.message);
  }
});