1

我正在寻找一种有效的方法来构建具有特定要求但长度可能不同的随机字符串。它必须

  • 至少包含一个大写字符。
  • 至少包含一个小写字符。
  • 至少包含一个数字。
  • 至少包含以下特殊字符之一:_-|@.,?/!~#$%^&*(){}[]+=

随机字符串不必是唯一的,但如果是,那就更好了。它将在 node.js 服务器中使用,因此可以使用任何加密库。我看到了Math.random().toString(36)接近但没有得到我的一切。我不确定我是否应该尝试为此构建一个正则表达式。

4

2 回答 2

3
var randomString = (function() {
  // Define character classes to pick from randomly.
  var uppers = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  var lowers = 'abcdefghijklmnopqrstuvwxyz';
  var numbers = '0123456789';
  var specials = '_-|@.,?/!~#$%^&*(){}[]+=';
  var charClasses = [uppers, lowers, numbers, specials];
  var minLen = charClasses.length;
  function chooseRandom(x) {
    var i = Math.floor(Math.random() * x.length);
    return (typeof(x)==='string') ? x.substr(i,1) : x[i];
  }
  // Define the function to actually generate a random string.
  return function(maxLen) {
    maxLen = (maxLen || 36);
    if (maxLen < minLen) { throw new Error('length must be >= ' + minLen); }
    do { // Append a random char from a random char class.
      var str='', usedClasses={}, charClass;
      while (str.length < maxLen) {
        charClass = chooseRandom(charClasses);
        usedClasses[charClass] = true;
        str += chooseRandom(charClass);
      }
      // Ensure we have picked from every char class.
    } while (Object.keys(usedClasses).length !== charClasses.length);
    return str;
  }
})();

randomString(); // => "o4m3H@YC7j0r@^gsY@1vlg2]cI66|9^beZ1)"
randomString(); // => "R6-K0Kq%4O0Je*=iPbVaV|bo-_,,g[j8wTW2"
randomString(); // => "!uu5NUWs1P}SRN78l}32Gno$]2m5PV+h+wTG"
于 2013-06-13T14:32:16.877 回答
0

正则表达式用于检查、捕获、拆分或替换字符串中的某些内容,您不能用它们从零开始构建某些内容。

但是,您可以在包含随机生成的数字的字符串中进行一些替换,以获得您想要的。

于 2013-06-13T13:55:00.510 回答