Как я могу получить класс персонажа в Java-регулярном выражении, например, [a-z], чтобы соответствовать - знак минус? - PullRequest
18 голосов
/ 30 сентября 2008
Pattern pattern = Pattern.compile("^[a-z]+$");
String string = "abc-def";
assertTrue( pattern.matcher(string).matches() ); // obviously fails

Возможно ли, чтобы класс символов совпадал с "-"?

Ответы [ 5 ]

37 голосов
/ 30 сентября 2008

Не ставьте знак минус между символами.

"[a-z-]"
7 голосов
/ 30 сентября 2008

Escape со знаком минус [А-г \ -]

6 голосов
/ 19 ноября 2010

Внутри класса символов [...] a - обрабатывается специально (как оператор диапазона) , если , оно окружено символами с обеих сторон. Это означает, что если вы включите - в начале или в конце класса символов, он будет трактоваться буквально (не спец).

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

^[a-z-]+$

или

^[-a-z]+$

Поскольку добавленный нами - трактуется буквально, избавляться от него не нужно. Хотя это не ошибка, если вы это сделаете.

Другой (менее рекомендуемый) способ - не включать - в класс символов:

^(?:[a-z]|-)+$

Обратите внимание, что в этом случае скобки не являются обязательными, так как | имеет очень низкий приоритет, поэтому с круглыми скобками:

^[a-z]|-+$

Будет соответствовать строчный алфавит в начале строки и один или несколько - в конце.

4 голосов
/ 30 сентября 2008

Я бы более конкретно перефразировал фразу «не помещайте это между символами».

Сделать тире первым или последним символом в классе символов. Например, «[-a-z1-9]» соответствует символам нижнего регистра, цифрам или тире.

3 голосов
/ 30 сентября 2008

Это работает для меня

   Pattern p = Pattern.compile("^[a-z\\-]+$");
   String line = "abc-def";
   Matcher matcher = p.matcher(line);
   System.out.println(matcher.matches());  // true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...