В java regex, как я могу получить класс символов, например. [a-z], чтобы соответствовать знаку "минус"?

Pattern pattern = Pattern.compile("^[a-z]+$");
String string = "abc-def";
assertTrue( pattern.matcher(string).matches() ); // obviously fails

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

Ответы

Ответ 1

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

"[a-z-]"

Ответ 2

Побег знака минус   [А-г\-]

Ответ 3

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

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

^[a-z-]+$

или

^[-a-z]+$

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

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

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

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

^[a-z]|-+$

Соответствует строчному алфавиту в начале строки и одному или нескольким - в конце.

Ответ 4

Я бы перефразировал "не помещаю его между персонажами" немного более конкретно.

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

Ответ 5

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

   Pattern p = Pattern.compile("^[a-z\\-]+$");
   String line = "abc-def";
   Matcher matcher = p.matcher(line);
   System.out.println(matcher.matches());  // true