代码之家  ›  专栏  ›  技术社区  ›  Andreas Dolk

regex-多行输入问题

  •  4
  • Andreas Dolk  · 技术社区  · 14 年前

    我有一个带有多行内容的字符串,希望选择一个多行区域,最好是使用正则表达式(因为我现在正试图理解Java正则表达式)。

    考虑如下输入:

    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 编译调用,但这(单独)并没有改变任何东西。

    我的错误在哪里?

    3 回复  |  直到 14 年前
        1
  •  8
  •   Matthew Flaschen    14 年前

    你想要 Pattern.DOTALL 如此 . 匹配换行符。 MULTILINE 解决了另一个问题, ^ $ 锚。

    Pattern p = Pattern.compile("START(.*)END", Pattern.DOTALL);
    
        2
  •  2
  •   Jon Freedman    14 年前

    您希望设置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");
        }
    }
    
        3
  •  1
  •   codaddict    14 年前

    regex元字符 . 与换行符不匹配。您可以尝试regex:

    START([\w\W]*)END
    

    其中使用 [\w\W] 代替 . .

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