2009-12-16 206 views
9

問候,檢查字符串是否只包含拉丁字符?

我正在開發GWT應用程序,用戶可以用日語輸入他的詳細信息。 但'userid'和'password'只能包含英文字符(拉丁字母)。 如何驗證字符串?

+1

有英文字符?!?!我認爲英文中的字符來自拉丁字母。 – 2009-12-16 02:38:02

+0

好,如果他的意思是ascii字符,那麼我會打電話給英文字符..或美國人。 – 2009-12-16 02:40:41

回答

26

對此,您可以使用String#matches()regex。拉丁字符覆蓋\w

因此它應該做的事:

boolean valid = input.matches("\\w+"); 

這順便也涵蓋了數字和下劃線_。不知道這是否有害。否則,您可以改用[A-Za-z]+

如果你還想覆蓋diacritical characters(ä,é,ò等等,這些都是每個定義也是拉丁字符),那麼你需要先對它們進行歸一化,並在匹配之前擺脫變音標記因爲沒有(記錄)正則表達式,它涵蓋了變音符號。

String clean = Normalizer.normalize(input, Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", ""); 
boolean valid = clean.matches("\\w+"); 

更新:有一個在Java中的正則表達式無證覆蓋發音符號爲好,\p{L}

boolean valid = input.matches("\\p{L}+"); 

上面的工作在Java 1.6。

+2

'\ p {L}'記錄在案:http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html#ubc – 2010-01-07 13:08:09

+1

Drat,你是對的。我會發誓,我從未在API文檔中見過多年。你是Sun API文檔的維護者嗎? – BalusC 2010-01-07 13:20:21

+1

不,但我已經通過特定的JavaDoc頁面閱讀的次數比我想承認的要多;-) – 2010-01-07 16:59:50

2

可能有更好的方法,但是您可以使用任何您認爲可以接受的字符來加載集合,然後檢查用戶名/密碼字段中的每個字符與該集合。

僞:


foreach (character in username) 
{ 
    if !allowedCharacters.contains(character) 
    { 
     throw exception 
    } 
} 
2

對於一些這個簡單,我會使用一個正則表達式。

private static final Pattern p = Pattern.compile("\\p{Alpha}+"); 

static boolean isValid(String input) { 
    Matcher m = p.matcher(input); 
    return m.matches(); 
} 

還有其他一些預先定義的類,如\w可能會更好地工作。

6
public static boolean isValidISOLatin1(String s) { return Charset.forName("US-ASCII").newEncoder().canEncode(s); } // or "ISO-8859-1" for ISO Latin 1 

僅供參考,請參閱documentation

+0

我不會使用它,因爲這允許輸入包含空格和控制字符(包括U + 0000),這幾乎肯定不會在用戶名中受到歡迎。 – 2010-01-07 13:09:19

+2

你忘記了在字符集上調用'newEncoder()'。 – Tvaroh 2013-10-01 10:40:07

+0

增加了一個對newEncoder的調用 – 2017-02-05 18:25:06

0

我成功地使用組合user232624的答案,Joachim SauerTvaroh

static CharsetEncoder asciiEncoder = Charset.forName("US-ASCII"); // or "ISO-8859-1" for ISO Latin 1 

boolean isValid(String input) {  
    return Character.isLetter(ch) && asciiEncoder.canEncode(username); 
} 
0

還有就是我的解決方案,它是工作出色的

public static boolean isStringContainsLatinCharactersOnly(final String iStringToCheck) 
{ 
    return iStringToCheck.matches("^[a-zA-Z0-9.]+$"); 
} 
相關問題