2009-12-16 4 views
9

Greetings,Проверьте строку, содержит ли она только латинские символы?

Я разрабатываю приложение GWT, где пользователь может ввести свои данные на японском языке. Но «userid» и «password» должны содержать только английские символы (латинский алфавит). Как проверить строки для этого?

+1

Есть английские символы?!?! Я думал, что символы на английском языке взяты из латинского алфавита. –

+0

хорошо, если он означает символы ascii, тогда я бы назвал это английскими персонажами .. или американскими. –

ответ

26

Для этого можно использовать String#matches() с размером regex. Латинские символы покрыты \w.

Так что это нужно сделать:

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

Это, кстати, также охватывает цифры и подчеркивание _. Не уверен, что это вредит. Иначе вы можете просто использовать [A-Za-z]+.

Если вы хотите также убрать diacritical characters (ä, é, ò и т. Д., Это определение также латинских символов), то вам необходимо сначала нормализовать их и избавиться от диакритических меток перед сопоставлением, просто потому что нет (задокументировано) regex, который охватывает диакритические знаки.

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

Update: есть недокументированная регулярное выражение в 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 –

+1

Drat, вы правы. Я бы поклялся, что я никогда не видел его раньше в документах API в течение многих лет. Вы поддерживаете документы Sun API? – BalusC

+1

Нет, но я читал эту конкретную страницу JavaDoc чаще, чем я хотел бы принять ;-) –

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), которые почти наверняка не приветствуются в имени пользователя. –

+2

Вы забыли называть 'newEncoder()' в кодировке. – Tvaroh

+0

Добавлен вызов newEncoder –

0

я успешно использовал комбинацию из ответов user232624, Joachim Sauer и Tvaroh:

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.]+$"); 
} 
Смежные вопросы