2012-03-04 5 views
1

Можно создать дубликат:
JAVA: check a string if there is a special character in itJava: проверить, если строка заканчивается или начинается с символа

Я пытаюсь создать метод, чтобы проверить, если начинается, пароль или заканчивается особый характер. Было несколько других проверок, которые мне удалось кодировать, но это кажется немного более сложным.

Я думаю, мне нужно использовать регулярное выражение, чтобы сделать это эффективно. Я уже создал метод, который проверяет наличие каких-либо специальных символов, но я не могу понять, как его модифицировать.

Pattern p = Pattern.compile("\\p{Punct}"); 
Matcher m = p.matcher(password); 
boolean a = m.find(); 
if (!a) 
    System.out.println("Password must contain at least one special character!"); 

Согласно книге, которую я читал, что нужно использовать^и $ в шаблоне, чтобы проверить, если он начинается или заканчивается с особым характером. Могу ли я просто добавить оба утверждения к существующему шаблону или как мне его начать?

EDIT:

Хорошо, я думаю, что я получил, не регулярок метод работы:

for (int i = 0; i < password.length(); i++) { 
    if (SPECIAL_CHARACTERS.indexOf(password.charAt(i)) > 0) 
    specialCharSum++; 
} 
+1

http://stackoverflow.com/questions/1795402/java-check-a-string-if-there-is-a-special-character-in-it –

ответ

4

Самый простой подход будет представлять собой или с группировкой.

Pattern p = Pattern.compile("(^\\p{Punct})|(\\p{Punct}$)"); 
Matcher m = p.matcher(password); 
boolean a = m.find(); 
if (!a) 
    System.out.println("Password must contain at least one special character at the beginning or end!"); 
+0

Хотя я, возможно, соблазню сделать это менее с длинной ветвью, если (! passowrd.matches (...)) [с соответствующей модификацией регулярного выражения, конечно]. –

+0

Несомненно, я пошел с минимальной модификацией кода дихрита. Я также рассмотрел что-то вроде подхода CharAt Адама Михалцина, но, опять же, плакат, похоже, понимает этот код, так зачем его менять? –

3

Используйте этот шаблон:

"^\\p{Punct}|\\p{Punct}$" 
  • ^\\p{Punct} = "начало строки, а затем символом пунктуации
  • | = "или"
  • \\p{Punct}$ =" символ пунктуации, а затем от конца строки "
5

Не можете ли вы использовать charAt, чтобы получить персонажа и indexOf, чтобы проверить, особенный персонаж или нет?

final String SPECIAL_CHARACTERS = "?#"; // And others 

if (SPECIAL_CHARACTERS.indexOf(password.charAt(0)) >= 0 
     || SPECIAL_CHARACTERS.indexOf(password.charAt(password.length() - 1)) >= 0) { 
    System.out.println("password begins or ends with a special character"); 
} 

Я не профилированный (профилирование золотое правило для исполнения), но я бы ожидать перебор времени компиляции постоянной строки, чтобы быть быстрее, чем создание и выполнения конечно-автомата для регулярного выражения , Более того, регулярные выражения Java более сложны, чем FSA, поэтому я ожидаю, что регулярные выражения Java будут реализованы по-разному и, таким образом, будут медленнее, чем FSA.

+2

Это точно то, что я набрал в окне редактирования прямо сейчас, но вы были быстрее. Я разделяю ваши мысли о (ab) с помощью регулярного выражения для простых простых случаев, подобных этому. – Barend

+0

Вы, безусловно, можете.Это просто зависит от того, нравится ли вам кратковременность регулярных выражений или предпочитает какой-то более подробный код в обмен на более очевидную информацию, если вы не знакомы с регулярными выражениями. Если вы знаете, что делаете, регулярные выражения могут сжимать различные проверки в одну краткую строку кода. Так что это действительно вопрос предпочтения - какой код более читабельный и понятный для вас? –

+0

@NeilCoffey Проверка, подобная этому, должна быть упакована в метод, независимо от того, используете ли вы регулярные выражения или нет. В другом коде, тогда проверка одинаково многозначна, потому что это один вызов метода в любом случае. Внутри метода смысл ясен в любом случае. –

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