你非常有趣的正则表达式,我尝试了很多时间,但有些困难。 正则表达规则:
- 用户可以使用以下字符全部小([a-z]),全部大写([A-Z]),数字([0-9])和follownig符号
!〜* :;<> +# - £$& _?(){} []和一个空格。所有的追逐者都是任何顺序, 但是,以下是:...输入无法以数字开头。
用户可以在输入的任何位置使用零个或一个空格,但输入不能以空格开头和结尾。
- 输入必须包含至少一个特殊的后续字符!〜* :;<> +# - £$& _?(){} []以任何顺序。
醇>
的Regex ='/ ^([A-ZA-Z] | | \〜| * | \:|!\; | \< |> | + |#| - | \£| \ $ | \ &放大器; |!_ | \ | {|} | [|] |(|)){1,20}(\ s){0,1}([A-ZA-Z] | | \〜| * | \:| \; | \< |> | + |#| - | \ d | \£| \ $ | \&安培; | _ | \ | {|} | [|] |(|)){? !1,20}(| \〜| * | \:|?\; | \< |> | + |#| - | \£| \ $ | \&放大器; | _ | \ | {|} | [|] |(|)){1,} $ / I'; 它满足所有规则,但不是第4条规则。
完整填写上述规则的完整正则表达式将不胜感激。
答案 0 :(得分:2)
在获得解决方案之前的一些提示。
您使用修饰符i
,表示“与案例无关”匹配。因此,a-zA-Z
只需使用a-z
或A-Z
。
从您的字符列表[a-zA-Z]|!|\~|*|\:|\;|\<|>|+|#|-|\£|\$|\&|_|\?|{|}|[|]|(|)
有些字符需要转义,因为它们在正则表达式中很特殊。
略过交替并将所有字符放入char类(你也可以省去转义)
要执行某些规则,您需要lookahead assertions
所以你的正则表达式(对于php)看起来像:
^(?![\d ])(?![^ ]*[ ][^ ]*[ ])(?=.*[!~*:;<>+#\-£$&_?{}\[\]()])[a-z\d!~*:;<>+#\-£$&_?{}\[\]() ]{6,15}(?<![ ])$
如果您需要 regex for JavaScript ,则无法使用lookbehind断言。您可以通过前瞻来替换它:
^(?![\d ])(?!.* $)(?![^ ]*[ ][^ ]*[ ])(?=.*[!~*:;<>+#\-£$&_?{}\[\]()])[a-z\d!~*:;<>+#\-£$&_?{}\[\]() ]{6,15}$
看到它here on Regexr(注意。我使用那里[^ \ r])只是因为我需要多行进行测试)
[a-z\d!~*:;<>+#\-£$&_?{}\[\]() ]{6,15}
以所需的长度匹配您要允许的所有字符。
(?![\d ])
negative lookahead assertion,确保字符串不以数字或空格开头。
(?![^ ]*[ ][^ ]*[ ])
negative lookahead assertion,确保字符串不会有多个空格
(?=.*[!~*:;<>+#\-£$&_?{}\[\]()])
positive lookahead assertion,确保字符串确实包含您的特殊符号
(?<![ ])$
negative lookbehind assertion,确保字符串不以空格结尾。
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}与其他字符一起,我们无法确定“开始”或“结束”的确在哪里。$symbols
被称为 lookaheads 。它们对于断言多个条件很有用。例如,(?=...)
声明某处有符号(因此(?=.*[$symbols])
);并且.*
断言,从头到尾,字符串的长度在6到15个字符之间(注意(?=.{6,15}\$)
只是因为它存在于双引号中而被转义)。$
被称为否定先行。 (?!...)
声称在任何地方都没有两个连续的空格。答案 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;
}