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

时间:2015-02-05 13:09:39

标签: java regex string substring

您好我有以下字符串

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”和一行“!”之间的内容。

我们可以使用正则表达式来实现这一目标吗?

1 个答案:

答案 0 :(得分:2)

您可以使用(?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)");