【问题标题】:Match string after newline换行后匹配字符串
【发布时间】:2014-03-14 23:15:47
【问题描述】:

在 Java 中我有这个字符串:

uk\learningAid\UserInputs\UserClass.java:16: error: cannot find symbol
player.mvRight(3);

我目前正在使用这个正则表达式来匹配16cannot find symbol

Pattern pattern = Pattern.compile(":(\\d+):\\serror:\\s(.*)");

但是,我还想匹配新行上的player.mvRight(3);。我该怎么做?

我尝试在 reex 末尾添加此 \\n(.*),但它无法匹配任何内容。

【问题讨论】:

  • 使用Pattern.compile("...", Pattern.DOTALL)
  • Pattern.DOTALL 覆盖不匹配任何新行的正则表达式 . 功能。但是,对我来说,这也会在player.mvRight(3); 之后检索文本。我只想匹配player.mvRight(3);,之后什么都没有。
  • 那么你必须更精确地了解你可能的输入和预期的输出
  • @RudiKershaw 我对任何事情都持开放态度。你能举个例子吗?
  • 你解决过这个问题吗?如果是这样,请不要忘记投票并接受答案。如果以下都不是您解决问题的方法,您可以发布自己的答案并接受。

标签: java regex newline


【解决方案1】:

匹配包括新行到第一个“;”。

Pattern pattern = Pattern.compile(":(\\d)+:\\serror:\\s(.*)\\n(.*);");

【讨论】:

  • 应该注意,在上面的例子中使用\s 可能是个坏主意,因为这将匹配任何空白字符,而不仅仅是普通空格。鉴于输入,这将更有意义::(\\d)+: error: (.*)\\n(.*);
  • 我使用的模式刚刚添加到作者使用的模式之上。否则,出于所述原因,您的替代方案也应该如此。
【解决方案2】:

根据您的 cmets,如果它不一定需要是正则表达式,那么 String 方法(例如 substring()indexof())可用于获取某些字符的位置并将其用作任何字符的标记具有特定模式的字符串。以下 SSCCE 应该适用于您的 String 和任何类似格式。

public  class Test {

    public static void main(String[] args) {
        String toProcess = "uk\\learningAid\\UserInputs\\UserClass.java:16: error: cannot find symbol \nplayer.mvRight(3);";
        int firstCol = toProcess.indexOf(":");
        int secondCol = toProcess.indexOf(":", firstCol+1);
        int lastCol = toProcess.lastIndexOf(":");
        System.out.println(toProcess.substring(firstCol+1, secondCol) + toProcess.substring(lastCol+1));
    }
}

输出:

16 cannot find symbol 
player.mvRight(3);

另外,如果您想删除换行符,您可以在开头调用toProcess = toProcess.replaceAll("\n", ""); 来删除换行符。

【讨论】:

    猜你喜欢
    • 2014-08-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多