我有一些代码:
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).\\(.*\\).*\\{)*$
,但它没有以正确的方式工作。你会建议什么?
答案 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)
.*
中删除第一个"^.*(?!(catch..."
,因为它允许if
和while
! 工作代码:
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
的更多信息在多线模式下,表达式^和$仅在之后或仅仅匹配 之前,分别是行终止符或输入的结尾 序列。默认情况下,这些表达式仅在开头匹配 整个输入序列的结束。