2016-09-23 74 views
1

我創建了一個正則表達式來檢查電子郵件地址是否有管理員,固件,服務&修復。如果我在電子郵件地址中輸入'ad'而不是'admin',那麼它也會根據要求返回true,這是不正確的。正則表達式不正確匹配限制值

private static final String EMAIL_PATTERN_New = 
      "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@" 
      + "[admin|firmware|repair|service]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; 

static String email = "[email protected]"; 
static String email1 = "[email protected]"; 
static String email2 = "[email protected]"; 
public static boolean validate(final String hex) { 
     pattern = Pattern.compile(EMAIL_PATTERN_New); 
     matcher = pattern.matcher(hex); 
     return matcher.matches(); 
    } 
System.out.println(validate(email));  //true 
System.out.println(validate(email1));  //true but it should be false 
System.out.println(validate(email2)); //true but it should be false 

與其他電子郵件地址相同的固件,服務,修理。

+2

更換'[管理員|固件|維修|服務] +'和'(管理員|固件|維修|服務)' –

+0

@WiktorStribiżew靜態字符串EMAIL2 =「[email protected] .COM「;即使我用建議替換+也會返回true。相反,它應該是錯誤的。 – Harleen

+0

[看這裏](https://regex101.com/r/iZ6uT2/3)。它不應該匹配正則表達式。 [這是一個Java演示](https://ideone.com/MbbE1A) –

回答

1

您需要用(admin|firmware|repair|service)替換[admin|firmware|repair|service]+

參見this regex demo

[admin|firmware|repair|service]+的是一個字符類匹配單獨的字符,ad等一次或多次(由於+)。因此,它將匹配adaddfir

(admin|firmware|repair|service)序列分組結構,只要符合admin,或firmware

注意,您可以通過縮短Java中的正則表達式與\w更換[_a-zA-Z0-9]

private static final String EMAIL_PATTERN_New = "^[\\w+-]+(?:\\.[\\w-]+)*@(?:admin|firmware|repair|service)(?:\\.[A-Za-z0-9]+)*\\.[A-Za-z]{2,}$"; 

你甚至可以刪除^$因爲您正在使用matches()方法的正則表達式。

Java demo from IDEONE

import java.util.*; 
import java.util.regex.*; 
import java.lang.*; 
import java.io.*; 

class Ideone 
{ 
    private static final String EMAIL_PATTERN_New = 
      "^[\\w+-]+(?:\\.[\\w-]+)*@(?:admin|firmware|repair|service)(?:\\.[A-Za-z0-9]+)*\\.[A-Za-z]{2,}$"; 

    public static void main (String[] args) throws java.lang.Exception 
    { 
     String email = "[email protected]"; 
     String email1 = "[email protected]"; 
     String email2 = "[email protected]"; 

     System.out.println(email.matches(EMAIL_PATTERN_New));  // true 
     System.out.println(email1.matches(EMAIL_PATTERN_New)); // false 
     System.out.println(email2.matches(EMAIL_PATTERN_New)); // false 
    } 
}