【问题标题】:Find all strings in between two strings multiple times多次查找两个字符串之间的所有字符串
【发布时间】:2014-08-31 23:42:25
【问题描述】:

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

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

等等

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

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

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

【问题讨论】:

  • 这些是新行吗?

标签: java regex string matcher


【解决方案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]

【讨论】:

    【解决方案2】:

    这也应该有效 -

    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;
        }
    

    【讨论】:

    • season*.*season 匹配 seaso some text note the incomplete first wordseason...
    猜你喜欢
    • 2021-05-07
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2017-07-07
    • 2020-05-28
    相关资源
    最近更新 更多