Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.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_String Concatenation - Fatal编程技术网

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

Javascript:正则表达式字符串和正则表达式的区别,javascript,regex,string-concatenation,Javascript,Regex,String Concatenation,我必须将给定的变量放入正则表达式中。当我使用硬编码数据时,它就工作了。这是我的代码 /^(?=.*[a-z])+(?=.*[A-Z])+(?=.*[0-9@#$-/:-?{-~!"^_`\[\]])+((?!ccarn).)*$/ var regex = new RegExp('/^(?=.*[a-z])+(?=.*[A-Z])+(?=.*[0-9@#$-/:-?{-~!"^_`\[\]])+((?!' + $scope.username + ').)*$/'); 这应该(并且确实)查找区分

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

/^(?=.*[a-z])+(?=.*[A-Z])+(?=.*[0-9@#$-/:-?{-~!"^_`\[\]])+((?!ccarn).)*$/
var regex = new RegExp('/^(?=.*[a-z])+(?=.*[A-Z])+(?=.*[0-9@#$-/:-?{-~!"^_`\[\]])+((?!' + $scope.username + ').)*$/');
这应该(并且确实)查找区分大小写的单词(本例中为密码),至少有一个大写字母和一个小写字母,以及一个数字或符号。但是,它不能包含“ccarn”一词。再次当我把它作为我的正则表达式放进去的时候,一切都正常了。当我试图把它转换成一个字符串来传递时,它就不起作用了。这是我的代码

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

我觉得我可能只是在翻译/转换过程中遗漏了一些东西,但似乎无法做到正确。TIA

当您使用
new RegExp()
构造函数从字符串构造正则表达式时,不应在字符串中包含前导和尾随的
/
/…/
表单仅在指定正则表达式文本时使用,而您在这里不这样做

当你这样做的时候,比如说,
var r=newregexp('/foo/')
,你实际得到的正则表达式相当于做
var r=/\/foo\/
,这显然不是你想要的。因此,您的构造函数实际上应该如下所示:

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

您可能还需要将反斜杠加倍(因为反斜杠是字符串中的转义字符,而不是正则表达式文本中的转义字符)。因此,当您使用
新RegExp()时,
[0-9@$-/:-?{-~!“^ `\[\]
需要变成
[0-9@$-/:-?{-~!”^ `\[\]

构造函数要从字符串构造正则表达式,您不应该在字符串中包含前导和尾随的
/
/…/
表单仅在指定正则表达式文字时使用,这不是您在这里要做的

当您这样做时,比如说,
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@$-/:-?{-~!“^u`\[\]
需要变成
[0-9@\$-/:-?{-~!^u`\[\]
在做任何其他事情之前,请阅读正则表达式教程

错误:

  • 前瞻是一个零宽度断言(换句话说,它只是一个测试,不匹配任何东西),为零宽度断言放置一个量词没有任何意义:
    (?=.*[A-z])+
    (这就像重复一些空的、零次或多次的内容。请注意,如果您编写这样的内容,正则表达式引擎将提出抗议。)

  • 使用oop语法定义模式(即:
    var pattern=new RegExp(“…
    ”)时,不需要添加分隔符。需要放置双反斜杠,而不是简单的反斜杠


  • 在做任何其他事情之前,请阅读regex教程

    错误:

  • 前瞻是一个零宽度断言(换句话说,它只是一个测试,不匹配任何东西),为零宽度断言放置一个量词没有任何意义:
    (?=.*[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).)*$\//
    
    正确的方法是从正则表达式中删除“/”字符,它应该可以工作

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

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


    如果仔细看一下,“/”字符在引号中被分隔,希望它能有所帮助

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

    /\/^(?=.*[a-z])+(?=.*[A-Z])+(?=.*[0-9@#$-\/:-?{-~!"^_`[]])+((?!ccarn).)*$\//
    
    正确的方法是从正则表达式中删除“/”字符,它应该可以工作

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

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


    希望它有帮助

    Unrelated,但就个人而言,如果只是检查正则表达式之外的字符串
    ccarn
    。甚至可以用一种不太复杂的方式检查有问题的字符类的存在。我非常喜欢正则表达式,但有时它们很难思考和排除故障。Unrelated,但就个人而言,如果只是检查strin对于正则表达式之外的
    ccarn
    。甚至可以用一种不太复杂的方式检查有问题的字符类的存在。我非常喜欢正则表达式,但有时它们很难思考和排除故障。