Ответ на обновленный вопрос ( версия 3 ):
str.matches("[a-zA-Z]+(?:[-/][a-zA-Z]+)?")
Объяснение
Хотя бы одна буква
[a-zA-Z]+
необязательно ... если вы сделали необязательное /
или -
(?:X)?
или (X)?
Оба работают, но первый не захватывает, и так как вам не нужно захватывать, это более подходящий для использования.
/
или -
[-/]
хотя бы еще одна буква
[a-zA-Z]+
Тест
public static void main(String[] args) {
test("abc/abc", "abc", "abc^abc", "abc\\abc");
}
static void test(String... inputs) {
for (String input : inputs)
System.out.println((input.matches("[a-zA-Z]+(?:[-/][a-zA-Z]+)?") ? "Valid" : "Invalid") + " -> " + input);
}
Вывод
Valid -> abc/abc
Valid -> abc
Invalid -> abc^abc
Invalid -> abc\abc
От комментарий :
Это лучше , но он терпит неудачу, когда я пытаюсь: abc\abc
или abc^abc
в качестве строки. Я думаю, что это относится и к тем символам, которые используются регулярным выражением.
Ну, они должны завершиться неудачей в соответствии с перечисленным правилом.
Если вы имели в виду, что хотите чтобы изменить правило, чтобы также разрешить \
и ^
, вам нужно добавить их внутри [ ]
.
Но вы должны знать о специальных символах внутри [ ]
:
-
- особый, указывающий диапазон, например, a-z
, но не особенный, если первый или последний. Escape с \
, если не первый или последний. Удвойте значение \
в строковом литерале Java до \\
.
^
является специальным, если сначала, что означает перевернуть список, например, [^a-z]
означает " не строчная буква`.
\
всегда особенный, так как он является escape-символом, поэтому вы должны экранировать его как \\
, и удваивая их в строковом литерале Java до \\\\
.
Что означает:
str.matches("[a-zA-Z]+(?:[-/^\\\\][a-zA-Z]+)?")
Тестовый вывод
Valid -> abc/abc
Valid -> abc
Valid -> abc^abc
Valid -> abc\abc
Invalid -> abc#abc