Javascript: 正则表达式字符串和正则表达式的区别

Javascript: Difference in Regex String and Regex

我必须将给定变量放入正则表达式中。当我使用硬编码数据时,它会起作用。这是我的代码

/^(?=.*[a-z])+(?=.*[A-Z])+(?=.*[0-9@#$-/:-?{-~!"^_`\[\]])+((?!ccarn).)*$/

这应该(并且确实)寻找区分大小写、至少有一个大写字母和一个小写字母以及一个数字或符号的单词(在本例中为密码)。但是,它不能包含单词 "ccarn"。再次当我把它作为我的正则表达式时一切正常。当我尝试将其转换为传入的字符串时,它不起作用。这是我的代码

var regex = new RegExp('/^(?=.*[a-z])+(?=.*[A-Z])+(?=.*[0-9@#$-/:-?{-~!"^_`\[\]])+((?!' + $scope.username + ').)*$/');

我觉得我可能只是在 translation/transition 中遗漏了一些东西,但似乎无法正确处理。 TIA

当您使用 new RegExp() 构造函数从字符串构造正则表达式时,不应在字符串中包括前导和尾随 //.../ 形式仅在指定正则表达式文字时使用,这不是您在此处所做的。

当你这样做时,比如说,var r = new RegExp('/foo/'),你实际上得到的正则表达式等同于var r = /\/foo\//,这显然不是什么你要。所以你的构造函数实际上应该是这样的:

var regex = new RegExp('^(?=.*[a-z])+(?=.*[A-Z])+(?=.*[0-9@#$-/:-?{-~!"^_`\[\]])+((?!' + $scope.username + ').)*$');
//                     ↑↑                                                                                       ↑↑
// no "/" at the locations pointed to above

您可能还需要将反斜杠加倍(因为反斜杠是字符串中的转义字符,而不是正则表达式文字中的转义字符)。所以,[0-9@#$-/:-?{-~!"^_`\[\]] 需要变成 [0-9@#$-/:-?{-~!"^_`\[\]]

请先阅读正则表达式教程!

错误:

  1. 先行是零宽度断言(换句话说,它只是一个测试,不匹配任何东西),为零宽度断言放置量词没有任何意义:(?=.*[a-z])+(这就像重复空的东西,零次或多次。注意,如果你这样写,正则表达式引擎会抗议。)

  2. 当你使用oop语法定义一个模式时(即:var pattern = new RegExp("...),你不需要添加分隔符。您需要使用双反斜杠而不是简单的反斜杠。

如果你仔细观察,当你把它放在引号内时,'/' 字符会被分隔,所以本质上是

var regex = new RegExp('/^(?=.*[a-z])+(?=.*[A-Z])+(?=.*[0-9@#$-/:-?{-~!"^_`\[\]])+((?!' + $scope.username + ').)*$/');

正则表达式是这样的

/\/^(?=.*[a-z])+(?=.*[A-Z])+(?=.*[0-9@#$-\/:-?{-~!"^_`[]])+((?!ccarn).)*$\//

正确的做法是从 RegEx 中删除“/”字符,它应该可以工作

var regex = new RegExp('/^(?=.*[a-z])+(?=.*[A-Z])+(?=.*[0-9@#$-/:-?{-~!"^_`\[\]])+((?!' + $scope.username + ').)*$/');

上面的输出是

/^(?=.*[a-z])+(?=.*[A-Z])+(?=.*[0-9@#$-\/:-?{-~!"^_`[]])+((?!ccarn).)*$/

这正是您所需要的?

希望对您有所帮助