多次查找两个字符串之间的所有字符串

时间:2014-08-31 23:42:25

标签: java regex string matcher

我知道这可能是重复但我没有找到满足这个问题的答案。我有一个像这样设置的大字符串:

季节
内容内容内容内容
赛季
内容内容内容内容
    赛季
内容内容内容内容

我想获取“season”字符串之间的所有内容,并将该内容放入List中。这是我的代码到目前为止,但它不起作用,它不匹配任何东西......

String pattern = "season";
    Pattern pattern2 = Pattern.compile(pattern+"(.*?)"+pattern);
    Matcher m = pattern2.matcher(str);
    while(m.find()) {
        System.out.println(m.group());

当我使用StringUtils.substringBetween()时,它确实有效,但我需要在两个“季节”字符串之间获取每个字符串。

2 个答案:

答案 0 :(得分:1)

最好的办法是使用lookahead断言season或字符串的结尾。同样,如果换行符序列在您想要使用dotall标记的模式之间,那么点.也会匹配换行符。

String s  = "season\nfoobar foobaz\n\nseason\nbarbaz\nseason\nbazquz";
Pattern p = Pattern.compile("(?s)season\\s*(.*?)(?=\\s*season|$)");
Matcher m = p.matcher(s);
List<String> arrayList = new ArrayList<String>();
while (m.find()) {
    arrayList.add(m.group(1));
}
System.out.println(arrayList); // [foobar foobaz, barbaz, bazquz]

答案 1 :(得分:0)

这也应该有效 -

import java.util.ArrayList;
import java.util.List;

public class Season {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String largeString = "season content content content content content season content content content content content season content content content content content";
        List<ArrayList<String>> lists = getStringBetweenSeason(largeString);
        for (ArrayList<String> list : lists) {
            for (String str : list)
                System.out.println(list);
        }

    }

    public static List<ArrayList<String>> getStringBetweenSeason(
            String largeString) {
        if (largeString == null)
            return null;
        List<ArrayList<String>> lists = new ArrayList<ArrayList<String>>();
        for (String str : largeString.split("season")) {
            if (!str.trim().isEmpty()) {
                ArrayList<String> list = new ArrayList<String>();
                for (String strContent : str.split(" ")) {
                    list.add(strContent);
                }
                lists.add(list);
            }
        }
        return lists;
    }
}

-----如果模式匹配是目标 - 那么这似乎也有效..

public static ArrayList<String> getStringBetweenSeason(String largeString) {
        if (largeString == null)
            return null;
        ArrayList<String> lists = new ArrayList<String>();
        Pattern p = Pattern.compile("season" + "*.*" + "season");
        Matcher m = p.matcher(largeString);

        while (m.find()) {
            lists.add(m.group());
        }

        return lists;
    }