我有一个包含多行内容的String,想要选择一个多行区域,最好使用正则表达式(因为我现在正试图理解Java RegEx)。
考虑输入:
Line 1
abc START def
Line 2
Line 3
gh END jklm
Line 4
假设START
和END
是唯一的以及区域的开始/结束标记,我想创建一个模式/匹配器来获得结果:
def
Line 2
Line 3
gh
我目前的尝试是
Pattern p = Pattern.compile("START(.*)END");
Matcher m = p.matcher(input);
if (m.find())
System.out.println(m.group(1));
但结果是
gh
所以m.start()
似乎指向包含'结束标记'的行的开头。我试图将Pattern.MULTILINE
添加到编译调用中,但是(单独)没有改变任何内容。
我的错误在哪里?
答案 0 :(得分:8)
您想要Pattern.DOTALL
,因此.
会匹配换行符。 MULTILINE
解决了另一个问题,^
和$
锚。
Pattern p = Pattern.compile("START(.*)END", Pattern.DOTALL);
答案 1 :(得分:2)
您想要设置Pattern.DOTALL(这样您可以将行尾字符与。通配符匹配),请参阅此测试:
@Test
public void testMultilineRegex() throws Exception {
final String input = "Line 1\nabc START def\nLine 2\nLine 3\ngh END jklm\nLine 4";
final String expected = " def\nLine 2\nLine 3\ngh ";
final Pattern p = Pattern.compile("START(.*)END", Pattern.DOTALL);
final Matcher m = p.matcher(input);
if (m.find()) {
Assert.assertEquals(expected, m.group(1));
} else {
Assert.fail("pattern not found");
}
}
答案 2 :(得分:1)
正则表达式metachar .
与换行符不匹配。你可以试试正则表达式:
START([\w\W]*)END
使用[\w\W]
代替.
。
[\w\W]
是一个匹配word-char和非word-char的char类,因此可以有效地匹配所有内容。