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@#$-/:-?{-~!"^_`\[\]]
。
请先阅读正则表达式教程!
错误:
先行是零宽度断言(换句话说,它只是一个测试,不匹配任何东西),为零宽度断言放置量词没有任何意义:(?=.*[a-z])+
(这就像重复空的东西,零次或多次。注意,如果你这样写,正则表达式引擎会抗议。)
当你使用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).)*$/
这正是您所需要的?
希望对您有所帮助
我必须将给定变量放入正则表达式中。当我使用硬编码数据时,它会起作用。这是我的代码
/^(?=.*[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@#$-/:-?{-~!"^_`\[\]]
。
请先阅读正则表达式教程!
错误:
先行是零宽度断言(换句话说,它只是一个测试,不匹配任何东西),为零宽度断言放置量词没有任何意义:
(?=.*[a-z])+
(这就像重复空的东西,零次或多次。注意,如果你这样写,正则表达式引擎会抗议。)当你使用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).)*$/
这正是您所需要的?
希望对您有所帮助