2015-02-09 3 views
0

Я хочу удалить комментарии в Java-коде. Я видел много примеров, но каждый из них был написан неправильно.Java - Regex - Remove comments

Вот пример кода:

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 
+1

Что вы попробовали? –

+1

Каков ваш ожидаемый результат? –

+0

Прочитайте нижний абзац ссылки, которую вы указали: * Решение этого - написать регулярные выражения, описывающие каждый из возможных более крупных элементов, найти их также, решить, какой тип элемента каждый, и отбросить те, которые не являются Комментарии. Существуют инструменты, называемые лексеры или токенизаторы, которые могут помочь с этой задачей. * – aioobe

ответ

4

Уже прокомментировал это, но давайте посмотрим, как далеко мы получаем. Java не делает регулярных выражений литералов так вскрыши, что один из this answer мы получаем следующее регулярное выражение:

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

Regular expression visualization

Debuggex Demo

Если мы тогда «заменить» каждый матч с первой группой захвата, каждое совпадение, которое не имеет группы захвата для начала (например, комментарий), удаляется:

Regex101 substitution Demo

Объяснение более общих "соответствует этому, за исключением условий a | b | c" -technique I занято here.

+1

Хорошее решение +1 для усилий, но в Java некоторые символы также могут быть представлены как Юникод, так же как '' \ '' могут быть записаны как '' \ u005C'' и будут обрабатываться как '' '' '' make string like '' foo \ u005C "bar" 'действительный и равный' 'foo \" bar "'. Из-за этого ваше регулярное выражение может выйти из строя https://regex101.com/r/vI2iW5/2 – Pshemo

+0

Woah, к моему глубокому удивлению, вы на самом деле правы: https://ideone.com/wr9x1W Итак, да, мое регулярное выражение требует, чтобы вы были достаточно для того, чтобы не писать символы кода Java/управления в синтаксисе '\ uXXXX' ** oO ** – funkwurm

+1

Итак, ваш ответ предполагает здравомыслие программиста ... Это безумие! Но да, с этим предположением ваш ответ имеет смысл. – Pshemo