Извлечь подстроку между двумя определенными словами, используя регулярное выражение в Java - PullRequest
10 голосов
/ 15 августа 2011

Я хотел бы извлечь подстроку между некоторыми двумя словами, используя java.

Например:

This is an important example about regex for my work.

Я хотел бы извлечь все между "an" и "for ".

То, что я до сих пор делал, это:

String sentence = "This is an important example about regex for my work and for me";
Pattern pattern = Pattern.compile("(?<=an).*.(?=for)");
Matcher matcher = pattern.matcher(sentence);

boolean found = false;
while (matcher.find()) {
    System.out.println("I found the text: " + matcher.group().toString());
    found = true;
}
if (!found) {
    System.out.println("I didn't found the text");
}

Это хорошо работает.

Но я хочу сделать еще две вещи

  1. Если предложение: This is an important example about regex for my work and for me. Я хочу извлечь до первого "for", то есть important example about regex

  2. Иногда я хочу ограничитьколичество слов между шаблоном до 3 слов, т.е. important example about

Любые идеи, пожалуйста?

Ответы [ 3 ]

8 голосов
/ 15 августа 2011

По первому вопросу сделайте его ленивым.Вы можете поставить вопросительный знак после квантификатора, и тогда квантификатор будет соответствовать как можно меньшему количеству.

(?<=an).*?(?=for)

Я понятия не имею, для чего дополнительный . в конце хорош в .*. егоненужный.

Для вашего второго вопроса вы должны определить, что такое «слово».Я бы сказал здесь, вероятно, просто последовательность без пробелов, за которой следуют пробелы.Примерно так:

\S+\s

и повторите это 3 раза вот так:

(?<=an)\s(\S+\s){3}(?=for)

Чтобы убедиться, что в шаблонах для целых слов используются границы слов

(?<=\ban\b)\s(\S+\s){1,5}(?=\bfor\b)

См.он онлайн здесь на Regexr

{3} будет точно соответствовать 3 для минимума 1 и максимум 3 для этого {1,3}

Альтернатива:

Как правильно указал dma_k в вашем случае, здесь нет необходимости использовать оглядываться назад и заглядывать в будущее.См. здесь документацию Matcher о группах

Вместо этого вы можете использовать группы захвата.Просто поместите часть, которую вы хотите извлечь, в скобки, и она будет помещена в группу захвата.

\ban\b(.*?)\bfor\b

Смотрите это онлайн здесь на Regexr

Вы можете чемполучить доступ к этой группе следующим образом:

System.out.println("I found the text: " + matcher.group(1).toString());
                                                        ^

У вас есть только одна пара скобок, так что все просто, просто введите 1 в matcher.group(1), чтобы получить доступ к первой группе захвата.

3 голосов
/ 15 августа 2011

Ваше регулярное выражение "an\\s+(.*?)\\s+for". Он извлекает все символы между и для игнорирования пробелов (\s+). Знак вопроса означает «жадный». Необходимо запретить шаблону .* есть все, включая слово «для».

2 голосов
/ 03 апреля 2014

открытый класс SubStringBetween {

public static String subStringBetween(String sentence, String before, String after) {

    int startSub = SubStringBetween.subStringStartIndex(sentence, before);
    int stopSub = SubStringBetween.subStringEndIndex(sentence, after);

    String newWord = sentence.substring(startSub, stopSub);
    return newWord;
}

public static int subStringStartIndex(String sentence, String delimiterBeforeWord) {

    int startIndex = 0;
    String newWord = "";
    int x = 0, y = 0;

    for (int i = 0; i < sentence.length(); i++) {
        newWord = "";

        if (sentence.charAt(i) == delimiterBeforeWord.charAt(0)) {
            startIndex = i;
            for (int j = 0; j < delimiterBeforeWord.length(); j++) {
                try {
                    if (sentence.charAt(startIndex) == delimiterBeforeWord.charAt(j)) {
                        newWord = newWord + sentence.charAt(startIndex);
                    }
                    startIndex++;
                } catch (Exception e) {
                }

            }
            if (newWord.equals(delimiterBeforeWord)) {
                x = startIndex;
            }
        }
    }
    return x;
}

public static int subStringEndIndex(String sentence, String delimiterAfterWord) {

    int startIndex = 0;
    String newWord = "";
    int x = 0;

    for (int i = 0; i < sentence.length(); i++) {
        newWord = "";

        if (sentence.charAt(i) == delimiterAfterWord.charAt(0)) {
            startIndex = i;
            for (int j = 0; j < delimiterAfterWord.length(); j++) {
                try {
                    if (sentence.charAt(startIndex) == delimiterAfterWord.charAt(j)) {
                        newWord = newWord + sentence.charAt(startIndex);
                    }
                    startIndex++;
                } catch (Exception e) {
                }

            }
            if (newWord.equals(delimiterAfterWord)) {
                x = startIndex;
                x = x - delimiterAfterWord.length();
            }
        }
    }
    return x;
}

}

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