Соответствие '_' и '-' в регулярных выражениях Java - PullRequest
6 голосов
/ 23 января 2010

У меня было это регулярное выражение в java , соответствующее буквенно-цифровому символу или тильде (~)

^([a-z0-9])+|~$

Теперь я должен добавить также символы - и _ Я пробовал несколько комбинаций, ни одна из которых не работает, например:

^([a-zA-Z0-9_-])+|~$ ^([a-zA-Z0-9]|-|_)+|~$

Примеры строк ввода, которые должны совпадать:

woZOQNVddd

00000

ncnW0mL14-

dEowBO_Eu7

7MyG4XqFz-

A8ft-y6hDu ~

Какие-нибудь подсказки / предложения?

Ответы [ 3 ]

7 голосов
/ 23 января 2010

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

Стоит отметить ярлык: \w эквивалентен [0-9a-zA-Z_], поэтому я думаю, что это более читабельно:

^([\w-]+|~$
3 голосов
/ 23 января 2010

Если сначала поставить -, он не будет интерпретироваться как индикатор диапазона.

^([-a-zA-Z0-9_])+|~$

Это соответствует всем вашим примерам, кроме последнего с использованием следующего кода:

String str = "A8ft-y6hDu ~";
System.out.println("Result: " + str.matches("^([-a-zA-Z0-9_])+|~$"));

Последний пример не подходит, потому что он не подходит под ваше описание. Регулярное выражение будет соответствовать любой комбинации буквенно-цифровых символов, - и _, ИЛИ символа ~.

3 голосов
/ 23 января 2010

Вам нужно экранировать -, например \-, поскольку это специальный символ (оператор диапазона). _ в порядке.

То есть ^([a-z0-9_\-])+|~$.

Редактировать : ваша последняя входная строка не будет соответствовать, потому что используемое вами регулярное выражение соответствует строке буквенно-цифровых символов (плюс - и _) ИЛИ тильде (из-за канала) , Но не оба. Если вы хотите разрешить дополнительную тильду в конце, измените на:

^([a-z0-9_\-])+(~?)$

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...