我有一个包含多行内容的字符串,并希望选择一个多行区域,最好使用正则表达式(因为我现在正在尝试理解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添加到编译调用中,但这(单独)并没有改变任何事情。
我的错误在哪里?
发布于 2010-09-10 17:05:25
您需要Pattern.DOTALL,这样.就可以匹配换行符。MULTILINE解决了一个不同的问题,即^和$锚。
Pattern p = Pattern.compile("START(.*)END", Pattern.DOTALL);发布于 2010-09-10 17:08:26
您希望设置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");
}
}发布于 2010-09-10 17:05:09
正则表达式metachar .与换行符不匹配。您可以尝试regex:
START([\w\W]*)END它使用[\w\W]代替.。
[\w\W]是一个字符类,用于匹配单词字符和非单词字符,因此可以有效地匹配所有内容。
https://stackoverflow.com/questions/3683353
复制相似问题