Java正则表达式,用于搜索排除某些字符串的多行文本

时间:2013-12-27 19:55:54

标签: java regex

我有一些代码:

String test = "int measure; \n" +
              "void introduce() { \n" +
              "while (line != null) { \n" +
              "if(measure > 0) { \n" +
              "System.out.println(smile); \n" +
                "} \n" +
              "}";  

String functions = "^.*(?!(catch|if|while|try|return|finally|new|throw)).*$";
Pattern patternFunctions = Pattern.compile(functions);
Matcher matcherFunctions = patternFunctions.matcher(test);
while(matcherFunctions.find()) 
          System.out.println(matcherFunctions.group());

这应该打印除第三和第四之外的所有行,因为它们包含“if”和“while”字样。但实际上它什么都不打印。 每一个帮助都会感激不尽。 谢谢。

更新

谢谢你们的回答!你的例子正在运作。我还有一个问题:在负面预测后,我想插入条件.*\\(.*\\).*\\{,这意味着文字包含.*<negotiation>.*(.*).*{以简单的方式,它应该从我的String test打印第二行。我试过这个正则表达式(?m)^.*(?!(catch|if|while|try|return|finally|new|throw).\\(.*\\).*\\{)*$,但它没有以正确的方式工作。你会建议什么?

3 个答案:

答案 0 :(得分:1)

尝试启用多线模式,如下所示:https://stackoverflow.com/a/6143347/584663

并且,在负面展望中包含点:https://stackoverflow.com/a/2387072/584663

产生:(?m)^((?!(catch|if|while|try|return|finally|new|throw)).)*$

答案 1 :(得分:1)

它没有输出,因为你的正则表达式是不正确的。

您需要删除开头.*,并在否定前瞻周围放置捕获或非捕获组,并重建结束.*以使点{{} 1}}放在最后一个括号之前,量词.放在*锚之前的最后一个括号之后。

您需要使用$修饰符(多行),使m^锚定符合每行的开头/结尾。我添加了使用$修饰符进行不区分大小写的匹配。

i

正则表达式:

String functions = "(?im)^(?:(?!(?:catch|if|while|try|return|finally|new|throw)).)*$";

请参阅Working demo

答案 2 :(得分:1)

  1. 从格式.*中删除第一个"^.*(?!(catch...",因为它允许ifwhile
  2. 使用多行标记编译正则表达式。
  3. 工作代码:

    String functions = "^((?!(catch|if|while|try|return|finally|new|throw))).*$";
    Pattern patternFunctions = Pattern.compile(functions, Pattern.MULTILINE);
    Matcher matcherFunctions = patternFunctions.matcher(test);
    

    有关java.util.regex.Pattern.Multiline

    的更多信息
      

    在多线模式下,表达式^和$仅在之后或仅仅匹配   之前,分别是行终止符或输入的结尾   序列。默认情况下,这些表达式仅在开头匹配   整个输入序列的结束。