我需要基于正则表达式生成一个字符串,该字符串将生成随机字母和数字,以及 36 个字符的字符串中随机位置的 4 个破折号。
示例:
123A5678-01B3C5F7-901R345-789F1-3456
我已经找到了一个正则表达式,它似乎可以很好地验证给定的字符串:
(?=.{36}$)([0-9A-Z]+-){4}([0-9A-Z])+
...但是使用相同的方法在 RandExp 中生成字符串最终会变得一团糟。它生成 36 个字符的字符串并添加 5 个随机长度的组:
new RandExp(/(?=.{36}$)([0-9A-Z]+-){4}([0-9A-Z])+/).gen()
M78QMOC6OGIF5OAJAJCG68CQWJGT5FX43CTKZ9CS9GXWLEKUKZMG602U5HPR4CEKO7OIX45CMLB7DS5RHZBI8KE8HGO9ET6OWS9A-PQSHN9E36KIMW328A1L0BHXCFOJVCD2ZT11-KD03XTZ375WP 7CR7YSF4CTSX-0FBJ3MZ4RNDLA5UZOHI5QWVY66PTUDDRCG-OH4F688VM1
我是否应该使用类似以下内容的字符串来满足固定宽度组:
([0-9A-Z]{6}-){4}[0-9A-Z]{8}
...或者有什么方法可以改进原始的正则表达式吗?
最佳答案
似乎不可能使用 Randexp
来限制前瞻的整个字符串长度。 . 我也尝试过您的模式,它会生成一个包含任何类型的 n 个字符的字符串,例如 $>Qa MG4XT@#j{3#&[+V4= ^“VQLI*|b%bp~@
(1)。
当你应用 anchor 时,更奇怪的是,new RandExp(/^(?=.{36}$)(?:[0-9A-Z]+-){4}[0-9A -Z]+$/)
还将在字符串开头生成约 30 个各种类型的字符。这可能与最终模式位置未使用 $
并被忽略有关(请参阅 Bad Regular Expressions )。 对我来说这看起来像是一个错误。
删除前瞻并在开头添加 ^
字符串开始 anchor 和在末尾添加 $
字符串结束 anchor 可以生成更好的字符串( 2)。但是,您可能确实只想使用固定长度组 (3)。
document.body.innerHTML = "(1) " + new RandExp(/(?=.{36}$)([0-9A-Z]+-){4}([0-9A-Z])+/).gen();
document.body.innerHTML += "<br/><br/>(2) " + new RandExp(/^(?:[0-9A-Z]+-){4}[0-9A-Z]+$/).gen();
document.body.innerHTML += "<br/><br/>(3) " + new RandExp(/^(?:[0-9A-Z]{6}-){4}[0-9A-Z]{8}$/).gen();
<script src="https://github.com/fent/randexp.js/releases/download/v0.4.1/randexp.min.js"></script>
然后,您可以尝试使用 /^(?:[0-9A-Z]{6,8}-){4}[0-9A-Z]{6,8 来解决该问题}$/
正则表达式在循环中,仅当字符串长度为 36 个字符时才返回结果:
var rdx = new RandExp(/^(?:[0-9A-Z]{6,8}-){4}[0-9A-Z]{6,8}$/);
var res = rdx.gen();
while (res.length !== 36) {
res = rdx.gen();
}
document.body.innerHTML = res;
<script src="https://github.com/fent/randexp.js/releases/download/v0.4.1/randexp.min.js"></script>
关于javascript - 使用 RandExp 生成基于正则表达式的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44363736/