【问题标题】:Substring between lines using Regular Expression Java使用正则表达式Java的行之间的子字符串
【发布时间】:2015-02-05 13:09:38
【问题描述】:

嗨,我有以下字符串

abc test ...
interface
somedata ...
xxx ...
!
sdfff as ##
example
yyy sdd @# .
!

我有一个要求,我想在包含单词“interface”或“example”的行与行“!”之间查找内容。
所需的输出如下所示

String[] output= {"somedata ...\nxxx ...\n","yyy sdd @# .\n"} ;

我可以使用 substring 和迭代手动执行此操作。但我想使用正则表达式来实现这一点。 有可能吗?

这是我尝试过的

String sample="abc\ninterface\nsomedata\nxxx\n!\nsdfff\ninterface\nyyy\n!\n";
    Pattern pattern = Pattern.compile("(?m)\ninterface(.*?)\n!\n");
    Matcher m =pattern.matcher(sample);
    while (m.find()) {
        System.out.println(m.group());
    }

我说的对吗?请提出正确的做法。

编辑:

一个小变化:我想在“interface”或“example”行和“!”行之间查找内容。

我们也可以使用正则表达式来实现这一点吗?

【问题讨论】:

    标签: java regex string substring


    【解决方案1】:

    您可以使用(?s) DOTALL 修饰符。

    String sample="abc\ninterface\nsomedata\nxxx\n!\nsdfff\ninterface\nyyy\n!\n";
    Pattern pattern = Pattern.compile("(?s)(?<=\\ninterface\\n).*?(?=\\n!\\n)");//Pattern.compile("(?m)^.*$");
    Matcher m =pattern.matcher(sample);
    while (m.find()) {
        System.out.println(m.group());
    }
    

    输出:

    somedata
    xxx
    yyy
    

    请注意,您的示例中的输入是不同的。

    • (?&lt;=\\ninterface\\n) 断言匹配的前面必须有与正向后看中存在的模式匹配的字符。

    • (?=\\n!\\n) 断言匹配后必须跟正前瞻中存在的模式匹配的字符。

    更新:

    Pattern pattern = Pattern.compile("(?s)(?<=\\n(?:example|interface)\\n).*?(?=\\n!\\n)");
    

    【讨论】:

    • 是的,它的工作原理。谢谢 。请参阅已编辑的问题。你能帮我吗?
    • 其他文字是什么意思?只需将 OR 运算符放在像(?&lt;=\\ninterface\\n|someother text) 这样的lookbehind 中
    猜你喜欢
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    相关资源
    最近更新 更多