Java正则表达式查找除B之外的所有A

时间:2015-05-31 00:12:59

标签: java regex

以下是这种情况: 我想使用java删除与"//[^\n]*"匹配的所有内容,除了匹配"\"[^\n]*//[^\n\"]\""的任何内容。差不多,我需要删除所有注释样式输入,除非它包含在字符串中。我尝试了正则表达式"(//[^\n]*)-(\"[^\n]*//[^\n]*\")",但这并没有取代任何东西。

2 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式从一行中删除评论:

^(([^\"]*|\"([^\"\\\\]|[\\\\].)*\")*)//.*$

并将其替换为第一个匹配组。此正则表达式还考虑了转义引用。

在Java中,这就像:

Pattern regex = Pattern.compile("^(([^\"]*|\"([^\"\\\\]|[\\\\].)*\")*)//.*$");
String code = ...;
String result = regex.matcher(code).replaceAll("$1");

online jdoodle demo

正则表达式强制执行一旦打开字符串,您也需要关闭它:

      start string          stop string
          |                     |
          v                     v
(([^\"]*|\"([^\"\\\\]|[\\\\].)*\")*)
    ^            ^       ^
    |            |       \escapes require at least one extra token
any non-string   non-escape in string

然后,您可以通过简单地将String拆分为单行并在行上循环并使用上面讨论的方法替换这些行来删除所有此类注释。

虽然如果你进行编程语言处理,最好利用该编程语言的解析器,或者用于进行此类语言处理的框架。

答案 1 :(得分:0)

这是多年前来自Perl的一个小组,我对它进行了一些修改以保留格式 有一个更简单的版本,不保留格式。

由于保存,这个使用多线模式 此外,如果您没有单引号字符串,请取出该部分。

它基本上与评论或非评论相匹配 运行它;

  • 设置多线模式
  • 使用$2
  • 进行全局替换

就是这样。

      # raw:   ((?:(?:^[ \t]*)?(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/(?:[ \t]*\r?\n(?=[ \t]*(?:\r?\n|/\*|//)))?|//(?:[^\\]|\\(?:\r?\n)?)*?(?:\r?\n(?=[ \t]*(?:\r?\n|/\*|//))|(?=\r?\n))))+)|("(?:\\[\S\s]|[^"\\])*"|'(?:\\[\S\s]|[^'\\])*'|(?:\r?\n|[\S\s])[^/"'\\\s]*)
      # quoted:  "((?:(?:^[ \\t]*)?(?:/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/(?:[ \\t]*\\r?\\n(?=[ \\t]*(?:\\r?\\n|/\\*|//)))?|//(?:[^\\\\]|\\\\(?:\\r?\\n)?)*?(?:\\r?\\n(?=[ \\t]*(?:\\r?\\n|/\\*|//))|(?=\\r?\\n))))+)|(\"(?:\\\\[\\S\\s]|[^\"\\\\])*\"|'(?:\\\\[\\S\\s]|[^'\\\\])*'|(?:\\r?\\n|[\\S\\s])[^/\"'\\\\\\s]*)"

      (                                # (1 start), Comments 
           (?:
                (?: ^ [ \t]* )?                  # <- To preserve formatting
                (?:
                     /\*                              # Start /* .. */ comment
                     [^*]* \*+
                     (?: [^/*] [^*]* \*+ )*
                     /                                # End /* .. */ comment
                     (?:                              # <- To preserve formatting 
                          [ \t]* \r? \n                                      
                          (?=
                               [ \t]*                  
                               (?: \r? \n | /\* | // )
                          )
                     )?
                  |  
                     //                               # Start // comment
                     (?:                              # Possible line-continuation
                          [^\\] 
                       |  \\ 
                          (?: \r? \n )?
                     )*?
                     (?:                              # End // comment
                          \r? \n                               
                          (?=                              # <- To preserve formatting
                               [ \t]*                          
                               (?: \r? \n | /\* | // )
                          )
                       |  (?= \r? \n )
                     )
                )
           )+                               # Grab multiple comment blocks if need be
      )                                # (1 end)

   |                                 ## OR

      (                                # (2 start), Non - comments 
           "
           (?: \\ [\S\s] | [^"\\] )*        # Double quoted text
           "
        |  '
           (?: \\ [\S\s] | [^'\\] )*        # Single quoted text
           ' 
        |  (?: \r? \n | [\S\s] )            # Linebreak or Any other char
           [^/"'\\\s]*                      # Chars which doesn't start a comment, string, escape,
                                            # or line continuation (escape + newline)
      )                                # (2 end)