2015-05-31 84 views
2

以下是案例: 我想使用java刪除與"//[^\n]*"匹配的所有內容,但任何內容都與"\"[^\n]*//[^\n\"]\""匹配。非常多,我需要刪除所有評論樣式輸入,除非它包含在一個字符串中。我嘗試了正則表達式"(//[^\n]*)-(\"[^\n]*//[^\n]*\")",但這並不能代替任何東西。Java正則表達式查找除B以外的所有A

+3

你需要的是解析器,而不是正則表達式。 – Pshemo

+1

我正試圖找到一種更簡單的方法來刪除評論。但我想你是對的。 +1 – HyperNeutrino

+1

@JamesSmith:所以你只想刪除所有評論? –

回答

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) 
+0

工程就像一個魅力!正是我需要它! – HyperNeutrino

+0

很高興聽到! – sln

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成單線條和環比線去除所有這些評論和用上面討論的方法替換這些行。

但如果你做編程語言處理,不如採取優勢在於編程語言,或用來做這樣的語言處理框架的解析器。

+0

這是行不通的;它不會取代評論。 – HyperNeutrino

+0

實際上,它取代了評論,但僅限於整條評論。否則,如果第一行是註釋,而第二行不是,則所有內容都將保留。 – HyperNeutrino

+0

@JamesSmith:你需要在源代碼上迭代每行的行數。你能舉出一個行不通的例子嗎? jdoodle顯然只會刪除評論。 –

相關問題