2014-01-09 53 views
1

我有狀態,如下正則表達式在字符串允許的字符返回false

以下特殊字符被允許在輸入字符串的限制要求:

. ""(),:;<>@[\] 

用於特殊的限制字符是它們只能在包含在引號之間時才能使用。

對於一個簡單的測試「:」輸入字符串中,我寫了如下代碼:

private static void testEmailPattern() { 
    String email = "Test\":\"mail"; 
    String PATTERN = "[\":\"]*"; 
    boolean isValidEmail = email.matches(PATTERN); 
    System.out.println("Status: " + isValidEmail); 
} 

但是這個代碼返回false,而不是真實的。

編輯:閱讀評論後,我修改了這個代碼,但它仍然顯示錯誤。

我修改我的代碼和下面進行的:

public class TestFeatures { 
    private Pattern pattern; 
    private Matcher matcher; 

    private static final String PATTERN = "[.*\":\".*]*"; 

    public TestFeatures() { 
     initEmailPattern(); 
    } 

    private void initEmailPattern() { 
     pattern = Pattern.compile(PATTERN);  
    } 

    public boolean validate(final String hex) { 
     matcher = pattern.matcher(hex); 
     return matcher.matches(); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     testEmailPattern(); 
    } 

    private static void testEmailPattern() { 
     String email = "Test\":\"[email protected]"; 
     TestFeatures thisClazz = new TestFeatures(); 
     boolean isValidEmail = thisClazz.validate(email); 
     System.out.println("Status: " + isValidEmail); 
    } 
} 
+0

用圓括號替換括號,並且不要使用'matches()'(或者在正則表達式的開始和結尾處加上'。*')。 – sp00m

+4

我的家庭作業感覺刺痛! – christopher

+1

'matches':「[t]確定該字符串**是否匹配給定的正則表達式」。 – usr2564301

回答

3

你要積極向前看,積極回顧後。

(.*(?<=")[.\x20(),:;<>@\[\]"](?=").*)+ 

說明

Regular expression visualization

示例代碼

String[] tests = { 
     "Test:mail", 
     "Test\":\"mail", 
     "Test\"ll", 
     ".\".", 
     "foo\"\"\"" 
}; 

String re = "(.*(?<=\")[.\\x20(),:;<>@\\[\\]\"](?=\").*)+"; 

int len=tests.length; 
for(int i=0; i<len;i++) { 
    System.out.format("Test %d: %s >> %s\n" , i+1, tests[i], tests[i].matches(re)); 
} 

輸出

Test 1: Test:mail >> false 
Test 2: Test":"mail >> true 
Test 3: Test"ll >> false 
Test 4: .". >> false 
Test 5: foo""" >> true 
+0

感謝您的意見。我修改了我的代碼,並更改了原始POst – DeSmOnd

+0

@DeSmOnd在您的問題中發佈您的代碼 – Stephan

+0

發佈了更新的代碼。 – DeSmOnd

1

[...]是一個字符類。角色類別與單個角色相匹配,並且大多數角色的含義在包含在角色類別中時會發生變化。當你有[.*\":\".*],匹配任何字符.*\":\".,或*的。 (最後三個字符是多餘的。)*重複前一個項目零次或多次。 As Alex said,.matches()只有在正則表達式匹配整個字符串時才返回true。 :.\"*.*..\":**\":::.\"*.

我想你想的正則表達式是:用你的正則表達式,[.*\":\".*]*.matches()只會字符串,看起來有點像這回真

[^.(),:;@\"\\[\\]\\\\*"]*(?:".*")?[^.(),:;@\"\\[\\]\\\\]* 

任何引號之前,任何字符,允許除指定的特殊字符(以下簡稱「SScs」)。這由正則表達式的第一部分完成:[^.(),:;@\"\\[\\]\\\\*"]*。它匹配任意大小的不包含SSC的字符序列。在全部字符串中的引號之後,除SScs之外的任何字符都是允許的。這就是[^.(),:;@\"\\[\\]\\\\]*在正則表達式的末尾。它將匹配字符串末尾的任何字符序列,只要它不包含SSC即可。在正則表達式中,有(?:".*")?。因爲任何字符在引號內都是允許的,所以這將匹配一個引號,後跟任意字符序列,後跟另一個引號。但是,由於該字符串可能不包含任何引號,因此通過問號將其設置爲可選。

你可以找到正則表達式的部分完整的演示和解釋here

+0

感謝您的解釋 – DeSmOnd

相關問題