Java 正则表达式中的多组匹配

Java 正则表达式中的多组匹配,java,regex,Java,Regex,我有一个输入字符串 invalidsufix\nsubadatax\nsufixpart\nsubdata1\nsomerandomn\nsubdata2\nsubdatan\nend 我只想获取它的子数据部分,我试过 Pattern p = Pattern.compile('(?<=sufixpart).*?(subdata.)+.*?(?=end)',Pattern.DOTALL); Matcher m = p.matcher(inputString); while(m.find(

我有一个输入字符串

invalidsufix\nsubadatax\nsufixpart\nsubdata1\nsomerandomn\nsubdata2\nsubdatan\nend
我只想获取它的子数据部分,我试过

Pattern p = Pattern.compile('(?<=sufixpart).*?(subdata.)+.*?(?=end)',Pattern.DOTALL);

Matcher m = p.matcher(inputString);
while(m.find()){ 
            System.out.println(m.group(1)); 
        }

Pattern p=Pattern.compile(”(?我会选择一种更简单的方法,首先使用类似于
start(.*end)的正则表达式获取块,然后使用类似于
的子数据\S*
-的正则表达式从组1中提取所有匹配项

见:

说明

  • (?sm)
    -启用点调用和多行模式
  • (?:\G(?!\A)^sufixpart$)
    -匹配上一次成功匹配的结尾(
    \G(?!\A)
    )或上面有
    sufixpart
    文本的整行(
    ^sufixpart$
  • (?:(?!^(?:sufixpart | end)$)*?
    -匹配不是整行的
    sufixpart
    end
    起点的任何单个字符
  • (子数据\S*)
    -组1匹配
    子数据和0+非空白
  • (?=.*^end$)
    -任何0+字符后必须有一行
    end
:

String rx=“(?sm)(\\G(?)\\A)^sufixpart$)(?:(?!^(?:sufixpart | end)$)*?(子数据\\S*)(?=.^end$)”;
字符串s=“invalidsufix\nsubadax\nsuffixPart\nsubdata1\nsomerandomn\nsubdata2\nsubdatan\nend\ninvalidsufix\nsubadax\nsuffixPart\nsubdata001\nsomerandomn\nsubdata002\nsubdata00n\nend”;
Pattern=Pattern.compile(rx);
匹配器匹配器=模式匹配器;
List res=new ArrayList();
列表lst=null;
while(matcher.find()){
如果(!matcher.group(1.isEmpty()){
如果(lst!=null)res.add(lst);
lst=新的ArrayList();
第一次添加(匹配器组(2));
}else-lst.add(匹配器组(2));
} 
如果(lst!=null)res.add(lst);
系统输出打印项次(res);

让我澄清一下:在特定子字符串第一次出现之后,您想得到整个字符串中的所有
子部分
吗?您能在
子字符串第一次出现之后得到一个子字符串吗
或类似的东西?您想要得到的最终结果是什么?感谢WiktorStribiżew,我有一个以
后缀
开头并以
结尾的块。我想要所有以
子数据
开头的
子部分。最终结果应该是块的所有
子数据
部分o、 每个输入字符串可以有多个块,对吗?或者只有一个块?我可以通过两个步骤来实现这一点,从输入字符串中提取块并循环,并使用另一个正则表达式来识别子数据部分。是否可以使用单个正则表达式来实现?为什么不
System.out.println(m.group());
非常感谢您的回答和解释。:)
String rx = "(?sm)^sufixpart$(.*?)^end$";
String s = "invalidsufix\nsubadatax\nsufixpart\nsubdata1\nsomerandomn\nsubdata2\nsubdatan\nend\ninvalidsufix\nsubadatax\nsufixpart\nsubdata001\nsomerandomn\nsubdata002\nsubdata00n\nend";
Pattern pattern_outer = Pattern.compile(rx);
Pattern pattern_token = Pattern.compile("(?m)^subdata\\S*$");
Matcher matcher = pattern_outer.matcher(s);
List<List<String>> res = new ArrayList<>();
while (matcher.find()){
    List<String> lst = new ArrayList<>();
    if (!matcher.group(1).isEmpty()) {                       // If Group 1 is not empty
        Matcher m = pattern_token.matcher(matcher.group(1)); // Init the second matcher
        while (m.find()) {                       // If a token is found
            lst.add(m.group(0));                 //    add it to the list
        }
    }
    res.add(lst);                                // Add the list to the result list
} 
System.out.println(res); // => [[subdata1, subdata2, subdatan], [subdata001, subdata002, subdata00n]]
(?sm)(?:\G(?!\A)|^sufixpart$)(?:(?!^(?:sufixpart|end)$).)*?(subdata\S*)(?=.*?^end$)
String rx = "(?sm)(\\G(?!\\A)|^sufixpart$)(?:(?!^(?:sufixpart|end)$).)*?(subdata\\S*)(?=.*?^end$)";
String s = "invalidsufix\nsubadatax\nsufixpart\nsubdata1\nsomerandomn\nsubdata2\nsubdatan\nend\ninvalidsufix\nsubadatax\nsufixpart\nsubdata001\nsomerandomn\nsubdata002\nsubdata00n\nend";
Pattern pattern = Pattern.compile(rx);
Matcher matcher = pattern.matcher(s);
List<List<String>> res = new ArrayList<>();
List<String> lst = null;
while (matcher.find()){
    if (!matcher.group(1).isEmpty()) {
        if (lst != null) res.add(lst);
        lst = new ArrayList<>();
        lst.add(matcher.group(2));
    } else lst.add(matcher.group(2)); 
} 
if (lst != null) res.add(lst);
System.out.println(res);