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