使用正则表达式 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)");
嗨,我有以下字符串
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)");