Java Regex группа без захвата регулярных выражений

#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)";