Regex для поиска строк, содержащихся между разделителями - PullRequest
0 голосов
/ 26 марта 2009

в этом тексте:

text text text [[st: aaa bbb ccc ddd eee fff]] text text
text text [[st: ggg hhh iii jjj kkk
lll mmm nnn]] text text text

Я пытаюсь получить текст между [[st: и это заканчивается]]

Моя программа должна вывести:

aaa bbb ccc ddd eee fff  (first match)
ggg hhh iii jjj kkk \n lll mmm nnn(second match)

Но я могу заставить его вернуть только первое [[st: и последнее]], так что вместо двух совпадений только одно Есть идеи?

Вот мой код:

package com.s2i.egc.test;

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

public class TestRegex {

    /**
     * @param args
     */
    public static void main(String[] args) {

        String bodyText = "text text text [[st: aaa bbb ccc ddd eee fff]] text text text text [[st: ggg hhh iii jjj kkk\n lll mmm nnn]] text text text";

        String currentPattern = "\\[\\[st:.*\\]\\]";

        Pattern myPattern = Pattern.compile(currentPattern, Pattern.DOTALL);

        Matcher myMatcher = myPattern.matcher(bodyText);

        int i = 1;

        while (myMatcher.find()) {
          String match = bodyText.substring(myMatcher.start() + 5, myMatcher.end() - 3);
          System.out.println(match + " (match #" + i + ")");
          i++;
        }                           


    }

}

Ответы [ 3 ]

3 голосов
/ 26 марта 2009

Квантор * (0 или больше) по умолчанию жадный, поэтому он соответствует второму]].

Попробуйте перейти к неохотному совпадению:

String currentPattern = "\\[\\[st:.*?\\]\\]";
2 голосов
/ 26 марта 2009

Вы должны использовать ленивый режим для звездочки

.*  

используйте вместо:

"\\[\\[st:.*?\\]\\]"
1 голос
/ 26 марта 2009

Просто для полноты, без жадной звезды, вы можете сопоставить открывающий [[st:, за которым следуют любые не] символы, возможно, включая последовательности из] символов, за которыми следуют не] символы, за которыми, наконец, следует ]]:

\[\[st:([^\]]*(?:\][^\]]+)*)\]\]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...