有趣的正则表达

时间:2013-06-18 05:34:22

标签: php javascript regex preg-replace preg-match

你非常有趣的正则表达式,我尝试了很多时间,但有些困难。 正则表达规则:

  
      
  1. 用户可以使用以下字符全部小([a-z]),全部大写([A-Z]),数字([0-9])和follownig符号
      !〜* :;<> +# - £$& _?(){} []和一个空格。所有的追逐者都是任何顺序,   但是,以下是:...
  2.   
  3. 输入无法以数字开头。

  4.   
  5. 用户可以在输入的任何位置使用零个或一个空格,但输入不能以空格开头和结尾。

  6.   
  7. 输入必须包含至少一个特殊的后续字符!〜* :;<> +# - £$& _?(){} []以任何顺序。
  8.   
  1. 输入长度在6-15之间。 问题:满足上述要求的正则表达式。我花了很多时间在它上面。但是制作下面的正则表达式。
  2.   

    的Regex ='/ ^([A-ZA-Z] | | \〜| * | \:|!\; | \< |> | + |#| - | \£| \ $ | \ &放大器; |!_ | \ | {|} | [|] |(|)){1,20}(\ s){0,1}([A-ZA-Z] | | \〜| * | \:| \; | \< |> | + |#| - | \ d | \£| \ $ | \&安培; | _ | \ | {|} | [|] |(|)){? !1,20}(| \〜| * | \:|?\; | \< |> | + |#| - | \£| \ $ | \&放大器; | _ | \ | {|} | [|] |(|)){1,} $ / I';   它满足所有规则,但不是第4条规则。

    完整填写上述规则的完整正则表达式将不胜感激。

3 个答案:

答案 0 :(得分:2)

在获得解决方案之前的一些提示。

  1. 您使用修饰符i,表示“与案例无关”匹配。因此,a-zA-Z只需使用a-zA-Z

  2. 从您的字符列表[a-zA-Z]|!|\~|*|\:|\;|\<|>|+|#|-|\£|\$|\&|_|\?|{|}|[|]|(|)

    1. 有些字符需要转义,因为它们在正则表达式中很特殊。

    2. 略过交替并将所有字符放入char类(你也可以省去转义)

  3. 要执行某些规则,您需要lookahead assertions

  4. 所以你的正则表达式(对于php)看起来像:

    ^(?![\d ])(?![^ ]*[ ][^ ]*[ ])(?=.*[!~*:;<>+#\-£$&_?{}\[\]()])[a-z\d!~*:;<>+#\-£$&_?{}\[\]() ]{6,15}(?<![ ])$
    

    如果您需要 regex for JavaScript ,则无法使用lookbehind断言。您可以通过前瞻来替换它:

    ^(?![\d ])(?!.* $)(?![^ ]*[ ][^ ]*[ ])(?=.*[!~*:;<>+#\-£$&_?{}\[\]()])[a-z\d!~*:;<>+#\-£$&_?{}\[\]() ]{6,15}$
    

    看到它here on Regexr(注意。我使用那里[^ \ r])只是因为我需要多行进行测试)

    正则表达式解释说:

    的Unicode:

    JavaScript本身不支持此功能!

    如果您想支持Unicode字母而不是旧的ASCII字母,请替换 [a-z] \p{L} i。然后,您还可以删除\p{L}修饰符,因为[\p{L}\p{Mn}\p{Mc}]Unicode property,匹配任何语言的所有字母(只有完整的字母,而不是组合字母,您可以使用{{1}} })

答案 1 :(得分:0)

我是这样做的。

<?php
    $symbols = '!~*:;<>+#\-£$&_?(){}\[\]';
    $regex = "/^(?=.*[$symbols])(?=.{6,15}\$)(?!.*  )[a-zA-Z][a-zA-Z0-9 $symbols]+[a-zA-Z0-9]$";
?>

如果以下任何解释不清楚,请参考其编号:

  1. 请注意,为方便起见,我们已将符号列表排除在外。
  2. 请注意,我们已转义-[],因为这些是字符类中有意义的字符。只要-位于开头或结尾,而]位于开头,就可以逃避它们,但是因为我们正在混合{{1}与其他字符一起,我们无法确定“开始”或“结束”的确在哪里。
  3. $symbols被称为 lookaheads 。它们对于断言多个条件很有用。例如,(?=...)声明某处有符号(因此(?=.*[$symbols]));并且.*断言,从头到尾,字符串的长度在6到15个字符之间(注意(?=.{6,15}\$)只是因为它存在于双引号中而被转义)。
  4. $被称为否定先行(?!...)声称在任何地方都没有两个连续的空格。
  5. 其余部分应该是显而易见的。

答案 2 :(得分:0)

就像@Juhana在评论中所建议的那样,为什么不单独测试你的规则而不是单一复杂的正则表达式呢?这样的事情。 (这些不是实际的解决方案或测试,因为你没有提供任何测试字符串,更多的例子是如何对你的问题进行不同的思考)

的Javascript

function verify(string) {
    var length = string.length;

    if (length < 6 || length > 15 || /^\d/.test(string) || /^\s/.test(string) || /\s$/.test(string) || /\s\s/.test(string) || /[!~*:;<>+#-£$&_?(){}[\]]+/.test(string)) {
        return false;
    }

    return true;
}

PHP

function verify($string) {
    $length = strlen($string);

    if ($length < 6 || $length > 15 || preg_match("/^\d/", $string) || preg_match("/^\s/", $string) || preg_match("/\s$/", $string) || preg_match("/\s\s/", $string) || preg_match("/[!~*:;<>+#-£$&_?(){}[\]]+/", $string)) {
        return false;
    }

    return true;
}