2009-04-14 5 views
4

В Java мне нужно убедиться, что строка содержит только alphanumeric, space и dash символов.Java, убедитесь, что строка содержит только буквенно-цифровые символы, пробелы и штрихи

Я нашел класс org.apache.commons.lang.StringUtils и почти адекватный метод isAlphanumericSpace(String) ... но мне также нужно включить тире.

Каков наилучший способ для этого? Я не хочу использовать регулярные выражения.

+0

Я также видел в той же библиотеке, что метод содержит только одно (String, char []), но это означает, что мне нужно будет перечислить весь алфавит, цифры от 0 до 9 и пробел и тире ... кажется немного более явным для того, что мне нужно делать. – Lancelot

ответ

6

Hum ... просто запрограммировать его самостоятельно, используя String.chatAt (INT), это довольно легко ...

перебрать все полукокса в строку, используя индекс позиции, а затем сравнить это используя тот факт, что ASCII символы от 0 до 9, а к г и а для использования Z последовательных кодов, поэтому вам нужно только проверить, что характер х численно проверяет одно из условий:

  • между «0» и ' 9 '
  • между 'A' и 'Z'
  • между 'A и 'Z'
  • пространства' '
  • дефиса '-'

Вот основной пример кода (с использованием CharSequence , который позволяет передавать строку, но и StringBuilder, как арг):

public boolean isValidChar(CharSequence seq) { 
    int len = seq.length(); 
    for(int i=0;i<len;i++) { 
     char c = seq.charAt(i); 
     // Test for all positive cases 
     if('0'<=c && c<='9') continue; 
     if('a'<=c && c<='z') continue; 
     if('A'<=c && c<='Z') continue; 
     if(c==' ') continue; 
     if(c=='-') continue; 
     // ... insert more positive character tests here 
     // If we get here, we had an invalid char, fail right away 
     return false; 
    } 
    // All seen chars were valid, succeed 
    return true; 
} 
+1

Я бы использовал тесты java.lang.Character вместо предположений на основе набора символов ASCII. – kenj0418

+0

Да, Character.isLetterOrDigit() делает это, но имеет очень высокую производительность (в 4 или 5 раз медленнее, чем просто сравнение кодовых точек). – Varkhan

+0

Он отклонит множество других действительных альфа-символов, которые просто мало используются на английском языке, так что это займет 1 мкс вместо 4 мкс. (да, это отклонит «μs» :-)) Сделать предположения, которые он не сказал, чтобы получить незначительное повышение производительности, о котором он не просил, это не очень хорошая идея. – kenj0418

3

Просто перебирайте строку, используя методы класса символов в java.lang.Character, чтобы проверить, приемлемо ли каждый символ или нет. По-видимому, это все, что делают методы StringUtils, а регулярные выражения - это всего лишь способ заставить генерализованный движок сделать то же самое.

1

у вас есть 1 из 2 вариантов: 1. Составьте список символов, которые могут быть в строке, то цикл по струнному фиксированию g, чтобы убедиться, что каждый символ IS в списке. 2. Составьте список символов, которые НЕ МОЖЕТ быть в строке, затем перебирайте строку, проверяя, чтобы каждый символ НЕ был в списке.

Выберите любой вариант, который быстрее может составить список.

10

Вы могли бы использовать:

StringUtils.isAlphanumericSpace(string.replace('-', ' ')); 
+0

Для ясности SkipHead означает StringUtils.isAlphanumericSpace (String), и это намного лучше, чем ручное кодирование взаимной проверки. – Syntax

0

Определенно использовать регулярное выражение. Нет смысла писать свою собственную систему, когда для этой точной задачи существует очень всеобъемлющая система. Если вам нужно узнать об этом или обновить регулярное выражение, то ознакомьтесь с этим сайтом, это здорово: http://regexr.com

Я бы бросил вызов этому.

Смежные вопросы