Некоторые проблемы, которые я вижу с вашим регулярным выражением:
Нет необходимости в последовательностях |[\r\n]
в вашем регулярном выражении; класс отрицанных символов, такой как [^*]
, соответствует всему, кроме *
, включая разделители строк. Только метасимвол .
(точка) не соответствует им.
Как только вы окажетесь внутри комментария, единственный символ, который вам нужно искать, это звездочка; если вы не видите ни одного из них, вы можете сожрать столько символов, сколько захотите. Это означает, что нет смысла использовать [^*]
, когда вместо него можно использовать [^*]+
. На самом деле, вы могли бы также поместить это в атомарную группу - (?>[^*]+)
- потому что у вас никогда не будет причин отказаться от каких-либо звездочек, как только вы их сопоставите.
Отфильтровывая посторонние ненужные вещи, последняя альтернатива внутри ваших крайних парней - \*+[^*/]
, что означает «одну или несколько звездочек, за которыми следует символ, который не является звездочкой или косой чертой». Это всегда будет совпадать со звездочкой в конце комментария, и ему всегда придется снова отказываться от него, потому что следующий символ - косая черта. Фактически, если до финального слеша есть двадцать звездочек, эта часть вашего регулярного выражения будет соответствовать всем им, тогда она откажется от всех по очереди. Тогда последняя часть - \*+/
- будет соответствовать им по крепости.
Для максимальной производительности я бы использовал это регулярное выражение:
/\*(?>(?:(?>[^*]+)|\*(?!/))*)\*/
Это будет соответствовать правильно сформированному комментарию очень быстро, но что более важно, если оно начинает совпадать с чем-то, что не является действительным комментарием, оно потерпит неудачу как можно быстрее.
Предоставлено Дэвид , вот версия, которая соответствует вложенным комментариям с любым уровнем вложенности:
(?s)/\*(?>/\*(?<LEVEL>)|\*/(?<-LEVEL>)|(?!/\*|\*/).)+(?(LEVEL)(?!))\*/
Он использует балансировочные группы .NET, поэтому он не будет работать ни в каком другом варианте. Для полноты приведем еще одну версию (из библиотеки RegexBuddy), в которой используется синтаксис рекурсивных групп, поддерживаемый Perl, PCRE и Oniguruma / Onigmo:
/\*(?>[^*/]+|\*[^/]|/[^*])*(?>(?R)(?>[^*/]+|\*[^/]|/[^*])*)*\*/