2016-05-30 3 views
1

у меня есть это регулярное выражение, чтобы удалить комментарии в .c файле (возвышенный 3 регулярных выражений)Regex Sublime для Java регулярное выражение

(^\/\/.*)|(\s+\/\/.*)|((\/\*)(.|\n)+?(\*\/)) 

Могу ли я использовать это регулярное выражение в Java, чтобы использовать его программно? Если нет, то какое регулярное выражение я должен использовать? (PS я знаю, вопрос нам глупое немного, но я не знаю, как регулярное выражение на всех)

+0

да, вы можете использовать it..you нужно только удвоить где бы ни были черты .. ps _i не говорю, что его правильное регулярное выражение для комментариев capture_ – rock321987

+0

работает в возвышенном виде, поэтому оно должно быть в java, я прав? –

+0

Да, это будет ... только вам нужно избежать косой черты .. как '\ s' для' \\ s' и всех остальных при использовании в Java – rock321987

ответ

1

Обратите внимание, что у вас есть слишком много избыточных групп захвата внутри шаблона, а (.|\n)+? конструкция очень неэффективно и может вызывают серьезные проблемы на Java (как и с любым другим движком regex).

Вы можете использовать более рационализирует выражение, которое не должно вызывать много избыточной откаты:

(?:^|\s+)//.*|/\*[^*]*\*+(?:[^/*][^*]*\*+)*/ 

ВИДЕТЬ regex demo. Используйте его с флагом Pattern.MULTILINE (или добавьте (?m) в начале рисунка).

Узор объяснение:

  • (?:^|\s+)//.* - (ваши 2 (^\/\/.*)|(\s+\/\/.*) ветви объединены) одной строкой комментарии в начале строки или после того, как первые 1+ пробелы следуют с // подстроки (включая эти непечатаемых и вперед слэши)
  • | - или
  • /\*[^*]*\*+(?:[^/*][^*]*\*+)*/ - матч многострочные /**/ комментарии

Java декларация:

String pattern = "(?m)(?:^|\\s+)//.*|/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/"; 

И sample code:

String s = "// Comment\ntex test\nMore text here // and comment 2\n/* More comments\nhere and\nhere */"; 
String pattern = "(?m)(?:^|\\s+)//.*|/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*/"; 
System.out.println(s.replaceAll(pattern, "")); 
+1

спасибо, это мне очень помогает! –

0

Это должно работать: (?:/\\*(?:[^*]|(?:\\*+[^*/]))*\\*+/)|(?://.*)

Ideone Demo

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