如何选择前一行正则表达式?

时间:2013-12-02 17:08:23

标签: java regex

我有以下输入:

-- input  --
Keep this
Chomp this
ChompHere:
Anything below gets chomped

我需要输出看起来像:

-- output (expected) --
Keep this

现在我根据以下代码得到以下内容:

-- output (actual) --
Keep this
Chomp this

ASK :如何删除正则表达式匹配的上一行(Chomp this):

public void chompPreviousLine() {
    String text = "Keep this\n"
            + "Chomp this\nChompHere:\nAnything below gets chomped";
    Pattern CHOMP= Pattern.compile("^(ChompHere:(.*))$", Pattern.MULTILINE | Pattern.DOTALL);
    Matcher m = CHOMP.matcher(text);
    if (m.find()) {
        // chomp everything below and one line above!
        text = m.replaceAll("");
        // but....??? how to delete the previous line ???
        text = text .replaceAll("[\n]+$", "");  // delete any remaining /n
        System.out.println(text);
    }
}

2 个答案:

答案 0 :(得分:1)

您可以修改正则表达式,使其也可以获取上一行:

Pattern CHOMP= Pattern.compile("[^\n]+\nChompHere:(.*)", Pattern.MULTILINE | Pattern.DOTALL);

[^\n]+\n将匹配任何不是行尾字符的连续字符,然后匹配行尾本身。由于它位于正则表达式中ChompHere之前,因此它将匹配ChompHere之前的完整行。

我已经删除了括号,因为你没有在算法中真正使用组;你确实在替换整个匹配的文本。

答案 1 :(得分:0)

你可以使用积极的预测:

^(.*)(?=ChompHere:)

根据您是否希望换行符匹配,您必须将其添加到前瞻。

但是一个简单的解析器不会更容易吗?