RegEx - 多行输入问题

时间:2010-09-10 09:01:20

标签: java regex

我有一个包含多行内容的String,想要选择一个多行区域,最好使用正则表达式(因为我现在正试图理解Java RegEx)。

考虑输入:

Line 1
abc START def
Line 2
Line 3
gh END jklm
Line 4

假设STARTEND是唯一的以及区域的开始/结束标记,我想创建一个模式/匹配器来获得结果:

 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添加到编译调用中,但是(单独)没有改变任何内容。

我的错误在哪里?

3 个答案:

答案 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类,因此可以有效地匹配所有内容。