#java #regex
#java #Регулярное выражение
Вопрос:
У меня возникли некоторые проблемы с получением регулярного выражения для сопоставления строки в Java. Вот строки, которые я хочу сопоставить: String Transformation Action
и Transformation Action
. В принципе, если String
присутствует, я хочу сопоставить его, иначе я бы сопоставил только оставшуюся строку.
Я пытался использовать группу без захвата в регулярных выражениях, однако она не работает.
Вот мое регулярное выражение: String regexFilter = "(?:String) (Transformation) (Action)";
. Это будет соответствовать String Transformation Action
, однако, как только я уберу String
, оно не будет соответствовать.
Комментарии:
1. Прочитайте о квантификаторах .
Ответ №1:
Вам нужно сделать String
часть необязательной, используя ?
:
String regexFilter = "(?:String )?(Transformation) (Action)";
Кроме того, нет особого смысла помещать группы захвата вокруг буквального текста (например Transformation
, и Action
), поскольку вы всегда знаете, что будут захватывать эти группы.
String regexFilter = "(?:String )?Transformation Action";
Комментарии:
1. Что, если я также хочу, чтобы «Действие» тоже было необязательным? Я попробовал то же самое с «Действием», и это сработало не так хорошо, как «Строка».
2. @Froggy Ты пробовал
(?:String )?Transformation(?: Action)?
?3. А, понятно. Я сделал это, за исключением того, что я поставил пробел между группами «Преобразование» и «Действие».
Ответ №2:
Сделайте String
часть необязательной, используя это регулярное выражение:
String regexFilter = "\b(?:String )?Transformation Action\b";
PS: Я также добавил \b
(границу слова), чтобы ваши строки не совпадали Transformation Action111
или xyzTransformation Action
не вводились.
Ответ №3:
Вам нужно сделать группу без захвата необязательной. ?
Квантификатор означает совпадение ( 1
или 0
время)
String regexFilter = "(?:String )?(Transformation) (Action)";