Соответствие между последовательностями символов - первый случай перед - PullRequest
0 голосов
/ 13 ноября 2009

У меня есть строка вроде:

"This is AA and this is AA and this is AA and this is the END blah blah"

Я хочу соответствовать:

"AA and this is the END"

т. Е. Заканчивая END, до первого вхождения AA перед END (Язык - это Java)

Ответы [ 2 ]

4 голосов
/ 13 ноября 2009

Попробуйте это:

AA(?:(?!AA).)*END

Демо:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main { 
    public static void main(String[] args) {
        String text = "This is AA and this is AA and this is AA and this is the END blah blah";
        Matcher m = Pattern.compile("AA(?:(?!AA).)*END").matcher(text);
        while(m.find()) {
            System.out.println("match ->"+m.group()+"<-");
        }
    }
}

И если между AA и END могут быть разрывы строк, добавьте (?s) (флаг DOT-ALL) в начале вашего регулярного выражения.

Краткое объяснение:

AA          # match 'AA'
(?:         # open non-capturing group 1
  (?!AA).   #   if 'AA' cannot be seen, match any char (except line breaks)
)*          # close non-capturing group 1 and repeat it zero or more times
END         # match 'END'
1 голос
/ 13 ноября 2009

Альтернативный ответ:

str.substring(0, str.lastIndexOf("END")).lastIndexOf("AA");

Это создает подстроку, расширяющуюся до «END», и находит последнее вхождение строки поиска в этой подстроке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...