首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RegEx -多行输入问题

RegEx -多行输入问题
EN

Stack Overflow用户
提问于 2010-09-10 17:01:20
回答 3查看 409关注 0票数 4

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

考虑如下输入:

代码语言:javascript
复制
Line 1
abc START def
Line 2
Line 3
gh END jklm
Line 4

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

代码语言:javascript
复制
 def
Line 2
Line 3
gh 

我目前的尝试是

代码语言:javascript
复制
Pattern p = Pattern.compile("START(.*)END");
Matcher m = p.matcher(input);
if (m.find())
  System.out.println(m.group(1));

但结果是

代码语言:javascript
复制
gh

因此,m.start()似乎指向包含“结束标记”的行的开头。我试图将Pattern.MULTILINE添加到编译调用中,但这(单独)并没有改变任何事情。

我的错误在哪里?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-10 17:05:25

您需要Pattern.DOTALL,这样.就可以匹配换行符。MULTILINE解决了一个不同的问题,即^$锚。

代码语言:javascript
复制
Pattern p = Pattern.compile("START(.*)END", Pattern.DOTALL);
票数 8
EN

Stack Overflow用户

发布于 2010-09-10 17:08:26

您希望设置Pattern.DOTALL (以便可以将行尾字符与。通配符),请查看此测试:

代码语言:javascript
复制
@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
EN

Stack Overflow用户

发布于 2010-09-10 17:05:09

正则表达式metachar .与换行符不匹配。您可以尝试regex:

代码语言:javascript
复制
START([\w\W]*)END

它使用[\w\W]代替.

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3683353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档