[英]interesting Regular Expression
嗨非常有趣的正則表達式,我嘗試了很多時間,但有些困難。 正則表達規則:
- 用戶可以使用以下字符全部小([az]),所有大寫([AZ]),數字([0-9])和follownig符號
!〜*:; <> +# - £$&_?(){} []和一個空格。 所有的追逐者都處於任何順序,但是重要的是:輸入不能以數字開頭。
用戶可以在輸入的任何位置使用零個或一個空格,但輸入不能以空格開頭和結尾。
- 輸入必須包含至少一個特殊的后續字符!〜* :; <> +# - £$&_?(){} []以任何順序。
正則表達式='/ ^([A-ZA-Z] | | \\〜| * | \\:|!\\; | \\ <|> | + |#| - | \\£| \\ $ | \\&| _ | \\ ?| {|} | [|] |(|)){1,20}(\\ S){0,1}([A-ZA-Z] | | \\〜| * | \\:|!\\; | \\ <|> | + |#| - |?!\\ d | \\£| \\ $ | \\&| _ | \\ | {|} | [|] |(|)){1,20}(| \\〜 | * | \\:|?\\; | \\ <|> | + |#| - | \\£| \\ $ | \\&| _ | \\ | {|} | [|] |(|)){1,} $ /我“; 它滿足所有規則但不是第4條規則。
完全符合上述規則的完整正則表達式將不勝感激。
在獲得解決方案之前的一些提示。
您使用修飾符i
,表示“與案例無關”匹配。 所以沒有a-zA-Z
只需要使用az
或AZ
。
從你的字符列表[a-zA-Z]|!|\\~|*|\\:|\\;|\\<|>|+|#|-|\\£|\\$|\\&|_|\\?|{|}|[|]|(|)
有些字符需要轉義,因為它們在正則表達式中很特殊。
跳過交替並將所有字符放在char類中(您也可以省略轉義)
要強制執行某些規則,您需要先行斷言
所以你的正則表達式(對於PHP)可能看起來像:
^(?![\d ])(?![^ ]*[ ][^ ]*[ ])(?=.*[!~*:;<>+#\-£$&_?{}\[\]()])[a-z\d!~*:;<>+#\-£$&_?{}\[\]() ]{6,15}(?<![ ])$
如果您需要JavaScript的正則表達式 ,則不能使用lookbehind斷言。 您也可以通過前瞻來替換它:
^(?![\d ])(?!.* $)(?![^ ]*[ ][^ ]*[ ])(?=.*[!~*:;<>+#\-£$&_?{}\[\]()])[a-z\d!~*:;<>+#\-£$&_?{}\[\]() ]{6,15}$
在Regexr上看到它(注意。我使用那里[^ \\ r])只是因為我需要多行進行測試)
[az\\d!~*:;<>+#\\-£$&_?{}\\[\\]() ]{6,15}
以所需長度匹配您要允許的所有字符。
(?![\\d ])
否定前瞻斷言 ,確保字符串不以數字或空格開頭。
(?![^ ]*[ ][^ ]*[ ])
負前瞻斷言 ,確保字符串沒有多個空格
(?=.*[!~*:;<>+#\\-£$&_?{}\\[\\]()])
正向前瞻斷言 ,確保字符串確實有一個特殊符號
(?<![ ])$
negative lookbehind斷言 ,確保字符串不以空格結尾。
JavaScript本身不支持此功能!
如果要支持Unicode字母而不是舊的ASCII字母,請將[az]
替換為\\p{L}
。 然后你也可以刪除i
修飾符,因為\\p{L}
是一個Unicode屬性 ,匹配任何語言的所有字母(只有完整的字母,而不是組合字母,你可以使用[\\p{L}\\p{Mn}\\p{Mc}]
)
這是我怎么做的。
<?php
$symbols = '!~*:;<>+#\-£$&_?(){}\[\]';
$regex = "/^(?=.*[$symbols])(?=.{6,15}\$)(?!.* )[a-zA-Z][a-zA-Z0-9 $symbols]+[a-zA-Z0-9]$";
?>
如果以下任何解釋不清楚,請參考他們的號碼:
-
, [
和]
,因為它們是字符類中有意義的字符。 只要-
在開頭或結尾,並且]
在開始時,就有可能不逃避它們,但由於我們將$symbols
與其他字符混合在一起,我們無法確定“開始”或“結束”真的是。 (?=...)
被稱為前瞻 。 它們對於斷言多個條件很有用。 例如, (?=.*[$symbols])
斷言某處有符號(因此.*
); 並且(?=.{6,15}\\$)
斷言,從頭到尾,字符串的長度在6到15個字符之間(注意$
只是因為它存在於雙引號中而被轉義)。 (?!...)
被稱為負向前瞻 。 (?!.* )
斷言任何地方都沒有兩個連續的空格。 就像@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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.