我正在尝试在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文件复选框。
答案 0 :(得分:2)
我会考虑使用以下正则表达式删除所有评论,然后使用简单的正则表达式查找所有getMessage()
次调用。
REGEX:〜/(?:/。?$ | *。?* /)〜
String regex = "(?ms)/(?:/.*?$|\*.*?\*/)"
<强> DEMO 强>
请注意s
标记,同时使.
匹配换行符。你可以使用带有补充组的字符而不是.
这样的字符就像[\w\W]
而不是第二个.
答案 1 :(得分:1)
如果有一个包含getMessage
的字符串怎么办? ;)
这就是我要做的,然后提取第2组的每个发现:
(['"])(?:(?!\1|\\).|\\.)*\1|\/\/[^\n]*(?:\n|$)|\/\*(?:[^*]|\*(?!\/))*\*\/|(getMessage\(\))
(这是我对更一般方法的改编,我在这里进一步解释和发布: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);
了解详情: