2015-02-09 98 views
0

我想删除Java代码中的注释。我见过很多例子,但每个都写错了。Java - Regex - 删除评论

这里是例子的代码:

String somestring = "http://google.com"; // "//google.com";" is going to be removed 

又如:

get.setHeader("Accept", "*/*"); // "/*");" and later is going to be removed too 

但我想正确的正则表达式,处理这些案件

我想: http://ostermiller.org/findcomment.html Regular expression to remove comment 和其他流行的例子

应该处理常见的情况:

somemethod();//it should be removed 
somemethod(); /* some comment that may end on other line */ 

但应办理等情况:

String somestring = "http://google.com"; // url shouldn't be touched 
get.setHeader("Accept", "*/*"); // "*/*" shouldn't be touched too 
+1

你试过了什么? – 2015-02-09 13:37:19

+1

您的预期产出是? – 2015-02-09 13:38:00

+0

阅读你提供的链接的底部段落:*解决这个问题的方法是编写正则表达式来描述每个可能的更大的元素,找到它们,决定每种元素的类型,并丢弃那些不是注释。有些工具称为词法分析器或标记器,可以帮助完成此任务。* – aioobe 2015-02-09 13:42:12

回答

4

已经评论这一点,但让我们看看我们走多远。 Java没有做正则表达式文字这样剥从this answer我们得到以下的正则表达式是一个:

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

Regular expression visualization

Debuggex Demo

如果我们再与第一捕获组“替换”每一场比赛,凡不具备捕获组开始(即评论)的比赛被删除:

Regex101 substitution Demo

更一般的的解释“除了在条件a | b | c”-我使用的技术可用here

+1

不错的解决方案+1,但在Java中,一些字符也可以用Unicode表示,就像'''''可以写成''\ u005C“'一样,并且将被视为'''使得字符串像'“foo \ uC”栏“'有效并等于'”foo \“栏”'。因此,你的正则表达式可能会失败https://regex101.com/r/vI2iW5/2 – Pshemo 2015-02-09 14:27:04

+0

Woah,令我十分惊讶的是,你确实是对的:https://ideone.com/wr9x1W所以是的,我的正则表达式需要你足够理智,不会在'\ uXXXX'语法中编写Java代码/控制字符** oO ** – funkwurm 2015-02-09 15:04:40

+1

所以,您的答案假定程序员的神经质......这太疯狂了!但是,有了这个假设,你的答案才有意义。 – Pshemo 2015-02-09 17:22:53