Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有简化正则表达式匹配字符的方法?_Javascript_Regex - Fatal编程技术网

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

我正在尝试构建一个ECMAScript(JavaScript)风格的正则表达式,以根据以下标准测试我的密码强度:

    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]
    as
    n
  • 特殊字符集为
    s
    (不确定我是否正确使用了此模式。)

然后,12的模式([A-Za-z&*@\^}\]\\):,$=!>密码复杂性!=强度。这很有帮助,但密码强度的最大决定因素是熵或密码长度。迈出第一步,允许密码不带特殊符号,但所需长度为20个字符以上。还建议使用简短的短语,使ppl更容易生成新密码。并排除有效密码中的“CorrectHorseBatteryStaple:)如果您的代码运行良好,没有问题,请考虑在.@ EngReXXBOX中发布问题,详细说明,我正在构建一个简单的JS随机密码生成器,它也向用户通知生成的密码的强度。上面的表还考虑了所选选项中的唯一字符的数目,所以对于NUBB来说。ers有10个唯一的字符,对于ABC、ABC、数字,#$&有90个。因此pwd-like
0000000
被认为是弱的,但是
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})/