2015-05-01 2 views
1

Я хочу проверить имя на Java, чтобы разрешить следующие специальные символы за один раз {, -. '}. Я могу добиться с помощью выражения, которое позволит пользователю вводить только такие специальные символы в строке. Но я не могу понять, как добавить ограничения, когда пользователи не могут добавлять эти символы более одного раза. Я пытался добиться этого с помощью квантификаторов, но остаюсь безуспешным. Я уже сделал следующий код!Проверка имени со специальными условиями с использованием regex

Pattern validator = Pattern.compile("^[a-zA-Z+\\.+\\-+\\'+\\,]+$"); 
+1

Можете ли вы опубликовать несколько примеров строк – vks

+0

@vks Вот примеры (John O'Malley-Smith) (John O'Malley-Smith) –

ответ

1

Вы можете использовать опережение утверждения в своем регулярном выражении:

Pattern validator = Pattern.compile(
    "^(?!(?:.*?\\.){2})(?!(?:.*?'){2})(?!(?:.*?,){2})(?!(?:.*?-){2})[a-zA-Z .',-]+$"); 

(?!(?:.*?[.',-]){2}) является отрицательным опережением, что означает, что не позволяет более чем 1 из этих символов в классе символов.

RegEx Demo

+0

, но его проверка «Джон О'Малли-Смит» как ложь! –

+0

Потому что эта строка имеет пробел и неправильную цитату '' '. , см. мой обновленный ответ – anubhava

+0

все еще проверяющий Джон О'Мэлли-Смит как ложный. вы можете сделать так, как это позволит {. '-.} за один раз. Разрешить алфавиты с пробелами –

0

Я думаю, что вы можете просто взять в имена учетных записей, где такие символы будут происходить только один раз. Такие имена, как «Джонатан», «Томс-Дамм», «Томс, Джон», «jonathan.thoms». На практике для имен я не думаю, что такие специальные символы будут встречаться по краям строки. Таким образом, вы, вероятно, можете уйти с регулярным выражением:

Валидатор шаблонов = Pattern.compile ("^ [a-zA-Z] + (?: [- ', \.] [A-zA-Z ?] +) $ ");

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

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