簡體   English   中英

有趣的正則表達

[英]interesting Regular Expression

嗨非常有趣的正則表達式,我嘗試了很多時間,但有些困難。 正則表達規則:

  1. 用戶可以使用以下字符全部小([az]),所有大寫([AZ]),數字([0-9])和follownig符號
    !〜*:; <> +# - £$&_?(){} []和一個空格。 所有的追逐者都處於任何順序,但是重要的是:
  2. 輸入不能以數字開頭。

  3. 用戶可以在輸入的任何位置使用零個或一個空格,但輸入不能以空格開頭和結尾。

  4. 輸入必須包含至少一個特殊的后續字符!〜* :; <> +# - £$&_?(){} []以任何順序。
  1. 輸入長度在6-15之間。 問題:滿足上述要求的正則表達式。 我花了很多時間在它上面。但是制作以下Regex表達式。

正則表達式='/ ^([A-ZA-Z] | | \\〜| * | \\:|!\\; | \\ <|> | + |#| - | \\£| \\ $ | \\&| _ | \\ ?| {|} | [|] |(|)){1,20}(\\ S){0,1}([A-ZA-Z] | | \\〜| * | \\:|!\\; | \\ <|> | + |#| - |?!\\ d | \\£| \\ $ | \\&| _ | \\ | {|} | [|] |(|)){1,20}(| \\〜 | * | \\:|?\\; | \\ <|> | + |#| - | \\£| \\ $ | \\&| _ | \\ | {|} | [|] |(|)){1,} $ /我“; 它滿足所有規則但不是第4條規則。

完全符合上述規則的完整正則表達式將不勝感激。

在獲得解決方案之前的一些提示。

  1. 您使用修飾符i ,表示“與案例無關”匹配。 所以沒有a-zA-Z只需要使用azAZ

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

    1. 有些字符需要轉義,因為它們在正則表達式中很特殊。

    2. 跳過交替並將所有字符放在char類中(您也可以省略轉義)

  3. 要強制執行某些規則,您需要先行斷言

所以你的正則表達式(對於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]$";
?>

如果以下任何解釋不清楚,請參考他們的號碼:

  1. 請注意,為方便起見,我們已將符號列表考慮在內。
  2. 請注意,我們已經轉義了-[] ,因為它們是字符類中有意義的字符。 只要-在開頭或結尾,並且]在開始時,就有可能逃避它們,但由於我們將$symbols與其他字符混合在一起,我們無法確定“開始”或“結束”真的是。
  3. (?=...)被稱為前瞻 它們對於斷言多個條件很有用。 例如, (?=.*[$symbols])斷言某處有符號(因此.* ); 並且(?=.{6,15}\\$)斷言,從頭到尾,字符串的長度在6到15個字符之間(注意$只是因為它存在於雙引號中而被轉義)。
  4. (?!...)被稱為負向前瞻 (?!.* )斷言任何地方都沒有兩個連續的空格。
  5. 其余的應該是顯而易見的。

就像@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM