使用Regular Expression查找未注释的java行

时间:2014-08-21 11:56:53

标签: java regex

我正在尝试在regEx后面创建一个负面外观的模式,以便不匹配我的java文件中的某些代码行。 我可以将此短语与此“(?<=//).*getMessage.*”匹配 上面的表达式与下面代码中的第1行匹配,

// Systme.out.println (obj1.getMessage());  //line1
/* Systme.out.println (obj.getMessage());*/ //line2    
/* public void test() {                     //line3 
   Systme.out.println (obj2.getMessage());  //line4
   }                                        //line5
*/ 
public void test() {                       
      Systme.out.println (obj5.getMessage()); //line 6
 }

但是,当我尝试使用“(?<!//).*getMessage.*”来否定它时,它仍然匹配所有第1行,第2行和第4行。

实际上,我的要求是匹配第6行的getMessage调用,并忽略在注释中调用getMessage的其他位置。

如果有人可以帮助我找到正确的表达方式,那就太好了。

PS:我无法访问java文件...我只需要将RegEx传递给表单并选中所有java文件复选框。

3 个答案:

答案 0 :(得分:2)

我会考虑使用以下正则表达式删除所有评论,然后使用简单的正则表达式查找所有getMessage()次调用。

REGEX:〜/(?:/。?$ | *。?* /)〜

String regex = "(?ms)/(?:/.*?$|\*.*?\*/)"

<强> DEMO

请注意s标记,同时使.匹配换行符。你可以使用带有补充组的字符而不是.这样的字符就像[\w\W]而不是第二个.

答案 1 :(得分:1)

如果有一个包含getMessage的字符串怎么办? ;)

这就是我要做的,然后提取第2组的每个发现:

(['"])(?:(?!\1|\\).|\\.)*\1|\/\/[^\n]*(?:\n|$)|\/\*(?:[^*]|\*(?!\/))*\*\/|(getMessage\(\))

Regular expression visualization

Debuggex Demo

(这是我对更一般方法的改编,我在这里进一步解释和发布:Regex for comments in strings, strings in comments, etc

答案 2 :(得分:1)

除了使用the String literal pattern from skamazin's answer之外,您还可以使用Pattern修饰符进行编译:

Pattern regex = Pattern.compile("/(?:/.*?$|\*.*?\*/)", Pattern.MULTILINE | Pattern.DOTALL);

了解详情: