代码之家  ›  专栏  ›  技术社区  ›  Matt Malone

如何仅在某些行上获得多个Java正则表达式匹配

  •  4
  • Matt Malone  · 技术社区  · 7 年前

    我正在调用一个无法更改的API。也就是说,我不能把它作为两个连续正则表达式或类似的东西。API是这样编写的(当然是简化的):

    void apiMethod(final String regex) {
        final String input = 
            "bad:    thing01, thing02, thing03 \n" +
            "good:   thing04, thing05, thing06 \n" +
            "better: thing07, thing08, thing09 \n" +
            "worse:  thing10, thing11, thing12 \n";
    
        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
    
        final Matcher matcher = pattern.matcher(input);
    
        while (matcher.find()) {
            System.out.println(matcher.group(1));
        }
    }
    

    我这样调用它:

    apiMethod("(thing[0-9]+)");
    

    我想看到打印出六行,从04到09,每行一行。到目前为止,我还没有成功。我尝试过一些不起作用的事情:

    • “(thing[0-9]+)”-这匹配所有12个东西,这不是我想要的。
    • “^(?:好|更好):(事物[0-9]+)”-这只匹配事物4和7。
    • “^(?:(?:好|更好):.*(事物[0-9]+)”-这只匹配事物6和9。
    • “(?:(?:^好:|^更好:|,)*)(事物[0-9]+)-这匹配除1和10之外的所有内容。

    我想要的是所有匹配“thing[0-9]+”的字符串,但只需要那些以“good:”或“better”开头的行中的字符串。

    或者,更一般地说,我希望从多行模式中进行多个匹配,但只能从具有特定前缀的行中进行匹配。

    1 回复  |  直到 7 年前
        1
  •  5
  •   Casimir et Hippolyte    7 年前

    \G 基于图案(在多行模式下):

    (?:\G(?!^),|^(?:good|better):)\s*(thing[0-9]+)
    

    这个 \G 锚定力匹配是连续的,因为它匹配上次成功匹配后的位置。


    如果行较短,也可以使用有限的可变长度查找:

    (?<=^(?:good|better):.{0,1000})(thing[0-9]+)