您好我有以下字符串
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”和一行“!”之间的内容。
我们可以使用正则表达式来实现这一目标吗?
答案 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)");