2015-05-31 3 views
2

Вот так: Я хочу использовать java, чтобы удалить все, что соответствует "//[^\n]*", за исключением всего, что соответствует "\"[^\n]*//[^\n\"]\"". В значительной степени мне нужно удалить все комментарии в стиле комментариев, за исключением случаев, когда он содержится внутри строки. Я попробовал regex "(//[^\n]*)-(\"[^\n]*//[^\n]*\")", но это ничего не заменит.Java регулярное выражение найти все A за исключением B

+3

Что вам нужно, это парсер, а не регулярное выражение. – Pshemo

+1

Я пытаюсь найти более простой способ удалить комментарии. Но я думаю, ты прав. +1 – HyperNeutrino

+1

@JamesSmith: так что вы только хотите удалить все комментарии? –

ответ

0

Это много лет назад из группы Perl, я немного изменил ее, чтобы сохранить форматирование.
Существует более простая версия, которая не сохраняет форматирование.

Этот режим использует многострочный режим из-за сохранения.
Кроме того, если у вас нет одиночных кавычек, выньте эту часть.

В основном это соответствует комментариям или комментариям.
Для запуска;

  • Установить режим Multi-Line
  • ли глобальное заменить $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

Собственно, он заменяет комментарии, но только если вся строка является комментарием. В противном случае, если строка первая - комментарий, а строка 2 - нет, все будет сохранено. – HyperNeutrino

+0

@JamesSmith: вам нужно выполнить итерацию строки в строке по исходному коду. Можете ли вы привести пример строки, которая не работает. Jdoodle явно удаляет комментарий только. –

Смежные вопросы