正则表达式 - 多行输入的问题

4
我有一个包含多行内容的字符串,想要选择一个多行区域,最好使用正则表达式(只是因为我现在正在尝试理解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个回答

8
您需要使用Pattern.DOTALL,这样.就可以匹配换行符。 MULTILINE解决的是不同的问题,即锚点^$
Pattern p = Pattern.compile("START(.*)END", Pattern.DOTALL);

谢谢!现在运行得非常顺利 :) - Andreas Dolk

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");
    }
}

谢谢!现在运行起来非常流畅 :) - Andreas Dolk

1
正则表达式元字符.不匹配换行符。您可以尝试使用以下正则表达式:
START([\w\W]*)END

该程序使用[\w\W]代替.

[\w\W]是一个字符类,用于匹配单词字符和非单词字符,因此可以有效地匹配所有内容。


谢谢!在我的特殊情况下,使用标志更适合于我现有的代码,但我一定会记住这个解决方案。 - Andreas Dolk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,