java - 正则表达式中的多组匹配

标签 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()){ 
            System.out.println(m.group(1)); 
        }

但我只得到第一场比赛。我怎样才能得到所有的子数据,比如[subdata1,subdata2,subdata3]

最佳答案

我会采用更简单的方法,首先使用 start(.*?)end 之类的正则表达式获取 block ,然后仅使用 subdata 从第 1 组中提取所有匹配项\S*-类似于正则表达式。

参见 Java demo :

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]]

另一种方法是使用基于 \G 的正则表达式:

(?sm)(?:\G(?!\A)|^sufixpart$)(?:(?!^(?:sufixpart|end)$).)*?(subdata\S*)(?=.*?^end$)

参见 regex demo

解释:

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

Java demo :

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

关于java - 正则表达式中的多组匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40501904/

相关文章:

java - 如何将实现 java.lang.Comparable 的类转换为实现 Scala.Ordered?

javascript - 如何使用正则表达式从 Javascript 中的字符串中提取数字

java - 正则表达式匹配整个字符串

php - 这个正则表达式在寻找什么

MySQL - 查找围绕搜索关键字的单词

java - JPA 多对多关系与额外的枚举列

java.lang.NoClassDefFoundError : scala/Predef$any2stringadd$ 错误

java - java中的具体类是什么

java - elasticsearch中的数组搜索

javascript - 密码的正则表达式,规则很少