Javascript(node.js)特定的随机string生成器

我正在寻找一个有效的方法来build立一个随机的string,具有特定的要求,但可以改变的长度。 它必须

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

随机string不一定是唯一的,但如果是,那么它更好。 它将被用在node.js服务器中,因此可以使用任何encryption库。 我看到Math.random().toString(36)接近,但没有得到我所有的东西。 我不确定是否应该尝试为此构build正则expression式。

 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" 

正则expression式用于检查,捕获,分割或replacestring中的某些东西,但不能从零开始构build。

但是,您可以在包含随机生成的数字的string中进行一些replace以获得所需的结果。