【问题标题】:Regular Expression to find non commented java lines正则表达式查找未注释的 java 行
【发布时间】:2014-10-15 01:15:58
【问题描述】:

我正在尝试为正则表达式后面的负面外观创建一个模式,以不匹配我的 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 调用,并忽略在 cmets 中调用 getMessage 的其他地方。

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

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

【问题讨论】:

  • 您可能需要使用两个表达式,尤其是查找跨多行的 cmets,即在 /**/ 之间。请注意,将正则表达式应用于非常规域(例如几乎所有语言)将始终只是一个近似值。

标签: java regex


【解决方案1】:

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

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

了解更多:

【讨论】:

    【解决方案2】:

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

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

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

    Debuggex Demo

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

    【讨论】:

      【解决方案3】:

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

      正则表达式:~/(?:/.?$|*.?*/)~

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

      DEMO

      请注意s 标志,使. 也匹配换行符。您可以使用带有互补组的字符而不是 . 所以这将类似于 [\w\W] 而不是第二个 .

      【讨论】:

      • @Thomas 我尝试制作一个正则表达式,如果评论在引号中,并且 this 到目前为止我得到了什么。不幸的是,这意味着您根本不能在评论中使用引号。所以它远非完美。我想我需要一个消极的回顾,但我还没有完全掌握它的语法
      • @skamazin 实际上,编程语言是一个非常规问题域,因此常规表达式有其局限性。为了绝对确定您需要使用更合适的表示,例如一个 AST。
      • 这个正则表达式会在这种情况下删除一个想要的getMessage()regex101.com/r/qP4lK8/1(边缘情况我同意,但我在句柄下面的回答是正确的)
      • @funkwurm 肯定有很多我没有考虑到的边缘情况。如果 OP 想要 100% 确定没有错误,他应该使用一些预定义的解析器而不是单个正则表达式。
      猜你喜欢
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 2013-10-19
      • 2013-09-14
      • 2013-08-14
      • 2011-10-28
      • 2012-05-18
      相关资源
      最近更新 更多