Javascript 有没有简化正则表达式匹配字符的方法?
我正在尝试构建一个ECMAScript(JavaScript)风格的正则表达式,以根据以下标准测试我的密码强度:Javascript 有没有简化正则表达式匹配字符的方法?,javascript,regex,Javascript,Regex,我正在尝试构建一个ECMAScript(JavaScript)风格的正则表达式,以根据以下标准测试我的密码强度: Characters Used Password Strength Length ABC abc 123 #$& WEAK ... 1 x 1-5 ... 2 x 1-5 3 x
Characters Used Password Strength Length
ABC abc 123 #$& WEAK ...
1 x 1-5 ...
2 x 1-5
3 x 1-7
4 x 1-5
5 x x 1-4
6 x x 1-4
7 x x 1-4
8 x x 1-4
9 x x 1-4
10 x x 1-4
11 x x x 1-4
12 x x x 1-3
13 x x x 1-4
14 x x x 1-4
15 x x x x 1-3
所以像2
,ABCD
,0123456
,ABCD
,aA#
等密码应该标记为弱密码。对于指定的组合012345678
、aA1#
等,不应使用更长的密码
这是我的很长的regex atm(根据上表,基本上是通过组粘在一起的):
/^([A-Za-z&*@\^}\]\\):,$=!>
有没有办法重用我在[]中指定的特殊字符,这样我就不必在每个组中都写这些字符了
不是用正则表达式文字,不是
不过,您可以使用RegExp
构造函数来实现。您可以通过使用string.raw
来缓解它需要字符串的事实,这样您就不必担心转义反斜杠:
const chars = String.raw`[the chars]`;
const rex = new RegExp(String.raw`^...${chars}...${chars}...$`);
您可以通过为此创建一个特定的标记函数来进一步了解它,如下所示(这是我新书第10章中的一个示例;有关详细信息,请参阅我的个人资料):
然后:
我不确定您使用的是哪个正则表达式引擎。但是,如果是Perl或Ruby,您可以使用子例程来在很大程度上实现这个。子例程是正则表达式中的重复模式
您可能知道反向引用。但是,子例程不同于反向引用。在反向引用的情况下,捕获组的内容是匹配的,而不是模式。但是,在子例程的情况下,模式匹配是重复的
让我们举个例子
- 测试字符串:
abcd defg
- Ruby中的正则表达式:
/(?[a-z]+)-\g/
。匹配将成功
\g
部分是Ruby中对名为dd
的组的子例程调用(\g
是Ruby正则表达式样式。对于您使用的引擎,它可能不同。)
详情如下:
在您的例子中,我认为您可以在每个组第一次出现在正则表达式中时对其进行命名,然后将其作为子例程引用
[A-Z]
作为A
[a-z]
作为a
[0-9]
asn
- 特殊字符集为
s
(不确定我是否正确使用了此模式。)
然后,12的模式([A-Za-z&*@\^}\]\\):,$=!>密码复杂性!=强度。这很有帮助,但密码强度的最大决定因素是熵或密码长度。迈出第一步,允许密码不带特殊符号,但所需长度为20个字符以上。还建议使用简短的短语,使ppl更容易生成新密码。并排除有效密码中的“CorrectHorseBatteryStaple:)如果您的代码运行良好,没有问题,请考虑在.@ EngReXXBOX中发布问题,详细说明,我正在构建一个简单的JS随机密码生成器,它也向用户通知生成的密码的强度。上面的表还考虑了所选选项中的唯一字符的数目,所以对于NUBB来说。ers有10个唯一的字符,对于ABC、ABC、数字,#$&有90个。因此pwd-like0000000
被认为是弱的,但是aA#9
不是。谈到安全性,我是个新手,只是想更好地理解这个问题。我更新了我的问题(指定了regex风格)。我正在使用ECMAScript(JavaScript)味道,似乎不支持子例程。我已经用一个在线工具(regex101)快速测试了您的第一个示例。只有PCRE(PHP)味道对我有效。@htmn我认为JavaScript不支持子例程:-(因此,你别无选择,只能用变量模块化你的代码,然后通过连接它们来构造最终的正则表达式。或者你可以试试TJCrowder的方法。(我对此不熟悉。)“我不确定你使用的是哪个正则表达式引擎。。。“问题的所有修订版,包括第一个,都会被标记。这会告诉你@htmn使用的引擎是什么。
const createRegex = (template, ...values) => {
// Build the source from the raw text segments and values
const source = String.raw(template, ...values);
// Check it's in /expr/flags form
const match = /^\/(.+)\/([a-z]*)$/.exec(source);
if (!match) {
throw new Error("Invalid regular expression");
}
// Get the expression and flags, create
const [, expr, flags = ""] = match;
return new RegExp(expr, flags);
};
const chars = String.raw`[the chars]`;
const rex = createRegex`/^...${chars}...${chars}...$/`;
/((\g<A>|\g<a>|\g<s>)){1,3})/
/((\g<a>|\g<A>|\g<n>)){1,4})/