使用正则表达式 Java 行之间的子字符串

Substring between lines using Regular Expression Java

嗨,我有以下字符串

abc test ...
interface
somedata ...
xxx ...
!
sdfff as ##
example
yyy sdd @# .
!

我有一个要求,我想在包含单词 "interface" 或 "example" 的行和“!”行之间查找内容。
所需的输出将如下所示

String[] output= {"somedata ...\nxxx ...\n","yyy sdd @# .\n"} ;

我可以使用子字符串和迭代手动执行此操作。但我想使用正则表达式来实现这一点。 可能吗?

这是我试过的

String sample="abc\ninterface\nsomedata\nxxx\n!\nsdfff\ninterface\nyyy\n!\n";
    Pattern pattern = Pattern.compile("(?m)\ninterface(.*?)\n!\n");
    Matcher m =pattern.matcher(sample);
    while (m.find()) {
        System.out.println(m.group());
    }

我说得对吗?请建议正确的方法。

编辑:

一个小改动:我想在 "interface" 或 "example" 行和“!”行之间查找内容。

我们也可以使用正则表达式来实现吗?

您可以使用 (?s) DOTALL 修饰符。

String sample="abc\ninterface\nsomedata\nxxx\n!\nsdfff\ninterface\nyyy\n!\n";
Pattern pattern = Pattern.compile("(?s)(?<=\ninterface\n).*?(?=\n!\n)");//Pattern.compile("(?m)^.*$");
Matcher m =pattern.matcher(sample);
while (m.find()) {
    System.out.println(m.group());
}

输出:

somedata
xxx
yyy

请注意,您的示例中的输入不同。

  • (?<=\ninterface\n) 断言匹配之前必须有字符,这些字符与正后视中存在的模式匹配。

  • (?=\n!\n) 断言匹配后必须跟有与正先行中存在的模式匹配的字符。

更新:

Pattern pattern = Pattern.compile("(?s)(?<=\n(?:example|interface)\n).*?(?=\n!\n)");