【问题标题】:Java - Regex - Remove commentsJava - 正则表达式 - 删除评论
【发布时间】:2015-04-09 06:24:31
【问题描述】:

我想删除 Java 代码中的 cmets。我看过很多例子,但每个都写错了。

下面是代码示例:

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

【问题讨论】:

  • 你的预期输出是什么?
  • 阅读您提供的链接的底部段落:解决此问题的方法是编写正则表达式来描述每个可能的较大元素,同时找到它们,确定每个元素的类型是,并丢弃不是 cmets 的。有一些称为词法分析器或标记器的工具可以帮助完成这项任务。
  • 您将需要 this approach。 Java 与 JavaScript 非常相似,所以我想对我的答案进行一些细微的调整就可以解决问题。
  • 这里的正则表达式似乎很难,因为你必须计算"\n/* 个字符
  • Regex 不是最好的工具。我们必须检查字符串中是否不存在//,这并不是那么简单(因为一些计算" 可能会很棘手,因为其中一些可能是" 文字用\" 转义的)。但我们也不能假设所有" 前面有\ 都是文字,因为字符串也可能是"\\",在这种情况下最后一个" 不是" 文字,而是正确的字符串结尾表示\ 字符。你需要的是解析器。

标签: java regex


【解决方案1】:

已经对此发表了评论,但让我们看看我们能走多远。 Java 不做正则表达式,所以从this answer 中剥离,我们得到以下正则表达式:

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

Debuggex Demo

如果我们随后用第一个捕获组“替换”每个匹配项,那么每个没有捕获组开头的匹配项(即评论)都会被删除:

Regex101 substitution Demo

我使用的更通用的“匹配这个,除了条件 a|b|c”的解释是可用的here

【讨论】:

  • 不错的解决方案 +1 努力,但在 Java 中,某些字符也可以表示为 Unicode,就像 \ 可以写成 "\u005C" 并且将被视为 \ 使字符串像"foo\u005C"bar" 有效且等于 "foo\"bar"。因此,您的正则表达式可能会失败regex101.com/r/vI2iW5/2
  • 哇,令我大吃一惊的是,您实际上是对的:ideone.com/wr9x1W 所以是的,我的正则表达式要求您足够清醒,不要在 \uXXXX 语法中编写 Java 代码/控制字符 oO
  • 所以你的答案假设程序员的理智......这太疯狂了!但是,是的,有了这个假设,你的答案是有道理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2017-08-04
  • 2017-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多