2012-08-07 33 views
-1

我想匹配一個字符串,如果它包含最多16位數字和最多11個字符,但總共最多27個字符。我試過(\d{0,16}\w{0,11}){27},但它似乎不起作用。如何使用正則表達式查找字符串中數字和字符的確切數量?

編輯:

MATCH:145214mkjnkj1234567891011125abcdefghijk(可混)

DONT MATCH:abababababab12312345678910111213abc

+1

數字和數字可以混合使用嗎?當然是 – 2012-08-07 15:07:23

+0

!你可以混合它! – trouble 2012-08-08 07:28:08

+0

它可以匹配'123abc456def'嗎? – 2012-08-08 08:03:09

回答

3

剛剛擺脫尾隨量詞和使用錨匹配字符串的開頭和結尾:

/^(\d{0,16}\w{0,11})$/ 

其中^匹配字符串的開始,$匹配字符串的結尾。現在這將匹配0-16個字符的字符串,然後是0-11個字符。請記住\w包括[A-Za-z0-9_],如果你想只匹配字母字符,你可以這樣做:

/^(\d{0,16}[a-z]{0,11})$/i 

編輯:由於(顯然)數字和字符可以混合使用,可以使用一個正則表達式來測試無效字符,然後做一些額外的處理,以確定是否爲每個字符類的最低要求得到滿足與另一個正則表達式,像這樣:

  1. 首先是檢查是否字符串包含任何無效字符。如果這個匹配,我們知道該字符串是無效

    if(preg_match('/[^\d\w]/', $input)) { 
        echo "Invalid input - Only digits and characters allowed.\n"; 
    } 
    

    注:上述假設\w的字符,只有字母字符,使用A-Za-z

  2. 如果上面的檢查通過了,現在我們知道該字符串只包含數字和字符,我們通過用空字符串替換所有數字來檢查它是否有足夠的字符,並檢查其餘字符只有那些在\w系列)是正確的長度。注意使用按引用$count參數,這裏命名$replacements,這將隱式告訴我們有多少個數字出現在字符串中,而我們正在檢查多少字符的字符串:

    $only_characters = preg_replace('/\d/', '', $input, -1, $replacements); 
    if(strlen($only_characters) > 11) { 
        echo "Invalid input - You can only have at most 11 characters\n"; 
    } 
    if($replacements > 16) { 
        echo "Invalid input - You can only have at most 16 digits\n"; 
    } 
    
+0

對!我嘗試它,這不工作! – trouble 2012-08-08 07:41:48

+0

@trouble - 您在原始問題中的要求不明確。我已經調整了我的答案以符合您的更改。 – nickb 2012-08-08 12:47:08

+0

@nickb我刪除了我的評論 - 所有的證據都沒有了......我的觀點仍然存在 – 2012-08-08 12:49:27

1

我不認爲你想要的東西可以通過REGEX輕鬆或高效地完成。根據我的理解你的問題,你希望有效的字符串最長爲27個字符,並且只包含數字和字符(由正則表達式\w定義),最多隻有16個數字和11個字符。

要做到這一點,最好的辦法是運行一些測試。

  1. 它是否僅匹配0到27個字符之間的單詞和數字;正則表達式:/[\d\w]{0,27}/
  2. 是否有16位或更少;正則表達式:/\d/然後計算匹配數
  3. 是否有11個字符或更少;正則表達式:/\w/然後計算匹配的數量

我沒有看到任何包裝成一個正則表達式的好處。

N.B.正如@nickb指出的那樣,\w類包含\d類,這樣看來,你必須定義自己的角色職業,而不是使用\w - 像[a-zA-Z_]相匹配整個拉丁美洲(不對外重音字符)字母字符和下劃線。

相關問題