2012-06-04 56 views
1

我通過檢查某些字符是否存在來測試字符串是否有效/無效。包含的字符串; #/%= | + \「<>被視爲無效。我下面在Java中實現當前,但我更喜歡一個更優雅的正則表達式的解決方案。使用正則表達式測試有效/無效字符串

public boolean isStringValid(String name) { 
    if ( name.contains(";") 
     || name.contains("#") 
     || name.contains("/") 
     || name.contains("%") 
     || name.contains("=") 
     || name.contains("|") 
     || name.contains("+") 
     || name.contains("\\") 
     || name.contains("\"") 
     || name.contains("<") 
     || name.contains(">")) { 
     return false; 
    } 
    else { 
     return true; 
    } 
} 

我做什麼它修改爲以下內容,

public boolean isNameValid(String name) { 
    return !Pattern.matches(".*(;|#|/|%|=|\\||\\+|\\\\|\"|<|>)+.*", name); 
} 

,但我似乎無法得到正則表達式的字符串權。在所有的Java轉義字符添加前原正則表達式的字符串如下,

.*(;|#|/|%|=|\||\+|\\|"|<|>)+.* 

使用字符c類似[A-z]的類似似乎不是一種選擇,因爲像「d @ vik」這樣的名字在我的情況下應該被認爲是有效的。

+2

當你想檢查一些東西時,最好檢查一下有效性,而不是一些無效的情況。 – popfalushi

+0

@popfalushi我通常會同意你的看法,但我只是根據我給出的規範寫了一個自動化測試腳本。誰知道開發人員的想法? ;) – hitsuyashi

回答

1

您是差不多吧。只需使用find()方法而不是matches()。並且只能編譯一次模式。這是最昂貴的操作。你可以使用[]簡化您的模式:在這種情況下,你不必寫的子模式之間|您正在尋找:

private static Pattern validator = Pattern.compile("[;%#=\\+]"); // etc: write all characters you need. 

現在重新寫你isNameValid()如下:

public boolean isNameValid(String name) { 
    return !validator.find(); 
} 

順便說一句反斜槓。如果你想讓你的模式包含反斜槓,它應該被寫入4次:正則表達式轉義兩次,java轉義兩次。

+1

+1查找。但模式不完整,我認爲它應該是'Pattern.compile(「[;#/%= \\ | \\ + \\\\\」<>]「)' –

+0

@RolandBouman, t不需要在字符類中轉義'+'和'|' – stema

+0

@RolandBouman和AlexR謝謝你們兩個。有一件事,Validator類似乎沒有find(),但它是一種方法所以返回代碼看起來是這樣的:return!validator.matcher(name).find();如果我錯了,請糾正我,或者讓我知道我是否合適,以便我可以接受答案:) – hitsuyashi

1

可以否定字符類:

Pattern.matches("[^;#/%=|+\\\\\"<>]+", name); 
相關問題