Ответ 1
Не помещайте знак минуса между символами.
"[a-z-]"
Pattern pattern = Pattern.compile("^[a-z]+$");
String string = "abc-def";
assertTrue( pattern.matcher(string).matches() ); // obviously fails
Возможно ли, чтобы класс символа соответствовал символу "-"?
Не помещайте знак минуса между символами.
"[a-z-]"
Побег знака минус [А-г\-]
Внутри класса символов [...]
a -
обрабатывается специально (как оператор диапазона) , если он окружен символами с обеих сторон. Это означает, что если вы включите -
в начале или в конце класса символов, он будет обрабатываться буквально (неспециально).
Итак, вы можете использовать регулярное выражение:
^[a-z-]+$
или
^[-a-z]+$
Поскольку -
, который мы добавили, обрабатывается буквально, нет необходимости его избегать. Хотя это не ошибка, если вы это сделаете.
Другой (менее рекомендуемый) способ состоит в том, чтобы не включать -
в класс символов:
^(?:[a-z]|-)+$
Обратите внимание, что скобки не являются необязательными в этом случае, поскольку |
имеет очень низкий приоритет, поэтому в скобках:
^[a-z]|-+$
Соответствует строчному алфавиту в начале строки и одному или нескольким -
в конце.
Я бы перефразировал "не помещаю его между персонажами" немного более конкретно.
Сделать тире первым или последним символом в классе символов. Например, "[-a-z1-9]" соответствует строчным символам, цифрам или тире.
Это работает для меня
Pattern p = Pattern.compile("^[a-z\\-]+$");
String line = "abc-def";
Matcher matcher = p.matcher(line);
System.out.println(matcher.matches()); // true