Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.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

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,我需要构建具有以下约束的JavaScript正则表达式: 输入字符串的长度必须至少为6个字符 输入字符串需要至少包含1个字母字符 输入字符串需要至少包含1个非字母字符 我严重缺乏JavaScript中的回溯功能。我想到的是: ((([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))....)| (.(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))...)| (..(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-

我需要构建具有以下约束的JavaScript正则表达式:

  • 输入字符串的长度必须至少为6个字符
  • 输入字符串需要至少包含1个字母字符
  • 输入字符串需要至少包含1个非字母字符
我严重缺乏JavaScript中的回溯功能。我想到的是:

((([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))....)|
(.(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))...)|
(..(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z]))..)|
(...(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z])).)|
(....(([a-zA-Z][^a-zA-Z])|([^a-zA-Z][a-zA-Z])))
这看起来很长。有更好的方法吗?

我是如何做到这一点的:

  • 字母字符的正则表达式是
    [a-zA-Z]
  • 非字母字符的正则表达式是
    [^a-zA-Z]
  • 所以我需要找一个
    [a-zA-Z][^a-zA-Z]
    [^a-zA-Z][a-zA-Z]

    So
    (([a-zA-Z][^a-zA-Z])([^a-zA-Z][a-zA-Z])
  • 我需要检查前面的n个字符和后面的6-n个字符
  • 这意味着:

    ^
    -字符串的开头
    (?=…)
    -后跟(即独立的子匹配;它不会移动当前匹配位置)
    {6}
    -六个字符(“字符串开头加六个字符”实现“长度必须至少为六个字符”规则)
    *
    -0个或更多字符(换行符除外-可能需要修复此问题?)
    [a-zA-Z]
    -字母(
    *[a-zA-Z]
    因此会在任何位置查找包含字母的字符串(从技术上讲,它会查找其中的最后一个字母))
    [^a-zA-Z]
    -非字母字符

    总之:从字符串的开头开始,我们尝试依次匹配以下各项:

    • 6个字符(如果我们找到这些字符,字符串长度必须为6个字符(或更多))
    • 后跟字母的任意字符串
    • 后跟非字母的任意字符串
      • 使用此正则表达式

        /^(?=.{6,})(?=.*[a-zA-Z])(?=.*[^a-zA-Z]).*$/
          -------- ------------- --------------
            ^          ^              ^
            |          |              |->checks for a single non-alphabet
            |          |->checks for a single alphabet
            |->checks for 6 to many characters
        

        (?=)
        是一种
        零宽度
        前瞻,它检查是否匹配。它不消耗字符。这就是为什么我们可以使用多个背对背的查找

        类似于其他查找的答案,因此这不需要太多解释,我认为最好的方法是这样做

        /^(?=.*[a-zA-Z])(?=.*[^a-zA-Z]).{6,}$/
        

        这从字符串的开头开始,查找字母字符,查找非字母字符,最后,它找到了一个6个以上字符的字符串,我认为没有必要查找长度的首字母

        对不起,我是一个正则表达式noob:是否需要开始时的
        ^
        ?你能解释一下你的正则表达式吗?@dystroy,从技术上讲,不是。但这是一个优化:如果正则表达式引擎不是很聪明,它将不得不在输入字符串的每个位置重复检查。否则,这就没有什么可匹配的了,看看-aheads@Some1.Kill.The.DJ由于结尾没有美元,我认为{6}没有问题。该组不必匹配整个字符串。你能解释一下你的正则表达式吗?@KeesC.Bakker
        (?=)
        看起来确实不错,你总是可以对检查进行重新排序,并在最后一个检查前后删除
        (?=)
        。这不仅仅是重新排序,而是删除冗余检查并获得匹配字符串。仅使用lookaheads不会输出匹配字符串,即使输入字符串匹配。好的,您也可以始终将
        *$
        添加到正则表达式中,这实际上就是您所做的:1)
        /^(?=.{6}(?=.[a-zA-Z])(?=.[^a-zA-Z])(?=.[^a-zA-Z])。$/
        2)重新排序:
        /^-.[[a-zA-Z])(?=.[^a-zA-Z])(?=.[^a-zA-Z])(?=.[^a-zA-Z])(?=.*/.-/.[[a-zA]。](?=.[^a-zA-Z]){6}.$/
        4)熔丝:
        /^(?=.[^a-zA-Z])(?=.[^a-zA-Z])。{6,}$/
        如果跳过第2步,你会得到
        /^(?=.{6})(?=.[a-zA-Z]).[^a-zA-Z].$/
        ,这同样有效。对不起,我不清楚。我回答这个问题的初衷是要把整个字符串匹配起来。我做到了。还有@Some1.Kill.The.DJ这样做了,但我认为检查字符串长度的先行检查是无用的,可以轻松地与字符串匹配本身连接,从而产生两个lookahead,而不是三个lookahead,我认为(可能会被反驳)会产生稍微更好的性能。你为什么不接受任何答案。还有问题吗?我总是给人们一个参与讨论的机会。
        /^(?=.*[a-zA-Z])(?=.*[^a-zA-Z]).{6,}$/