Улучшение/Фиксация Regex для C разрабатывает комментарии блока

Приведенный выше ответ верен, вы не сделаете это без разрешения. Вы можете сделать это с разрешения только путем описания в этой ссылке.

Хотя в новых политиках Google вы не можете запрашивать разрешение журналов вызовов и SMS, если вашему приложению не требуются эти разрешения .

Итак, я думаю, что нет никакого способа сделать это.

10
задан Colin Burnett 19 May 2009 в 19:49
поделиться

3 ответа

Некоторые проблемы я вижу с Вашим regex:

Нет никакой потребности в |[\r\n] последовательности в Вашем regex; отрицаемый класс символов как [^*] соответствия все кроме *, включая разделители строки. Это только . (точечный) метасимвол, который не соответствует им.

После того как Вы в комментарии, единственный символ, который необходимо искать, является звездочкой; пока Вы не видите одного из тех, можно проглотить как много символов, которые Вы хотите. Это означает, что не имеет никакого смысла использовать [^*] когда можно использовать [^*]+ вместо этого. На самом деле Вы могли бы также поместить это в атомарную группу- (?>[^*]+) - потому что у Вас никогда не будет причины бросить любую из тех не-звездочек, после того как Вы соответствовали им.

Отфильтровывая посторонний спам, заключительная альтернатива в Вашем наиболее удаленном parens \*+[^*/], что означает "одну или несколько звездочек, сопровождаемых символом, который не является звездочкой или наклонной чертой". Это будет всегда соответствовать звездочке в конце комментария, и это должно будет всегда бросать его снова, потому что следующий символ является наклонной чертой. На самом деле, если будет двадцать продвижения звездочек до заключительной наклонной черты, то та часть Вашего regex будет соответствовать им всем, то это даст им всем, один за другим. Затем заключительная часть- \*+/ - будет соответствовать им для, сохраняет.

Для максимальной производительности я использовал бы этот regex:

/\*(?>(?:(?>[^*]+)|\*(?!/))*)\*/

Это будет соответствовать правильно построенному комментарию очень быстро, но что еще более важно, если он начинает соответствовать чему-то, что не является действительным комментарием, он перестанет работать как можно быстрее.


Любезность David, вот версия, которая соответствует вложенным комментариям любому уровню вложения:

(?s)/\*(?>/\*(?<LEVEL>)|\*/(?<-LEVEL>)|(?!/\*|\*/).)+(?(LEVEL)(?!))\*/

Это использует Balancing Groups.NET, таким образом, это не будет работать ни в какой другой разновидности. Ради полноты вот другая версия (из Библиотеки RegexBuddy), который использует Рекурсивный синтаксис Групп, поддерживаемый Perl, PCRE и Oniguruma/Onigmo:

/\*(?>[^*/]+|\*[^/]|/[^*])*(?>(?R)(?>[^*/]+|\*[^/]|/[^*])*)*\*/
16
ответ дан 3 December 2019 в 14:25
поделиться

Можно хотеть попробовать опцию Singleline а не Multiline, затем Вы не должны волноваться о \r\n. С этим включил следующее, работавшее для меня с простым тестом, который включал комментарии, которые охватили больше чем одну строку:

/\*.*?\*/
2
ответ дан 3 December 2019 в 14:25
поделиться

Я думаю, что Ваше выражение является слишком сложным. Относившийся большая строка, много альтернатив подразумевают большое отслеживание в обратном порядке. Я предполагаю, что это - источник хита производительности, который Вы видите.

Если основное предположение должно соответствовать всему от "/*" до первого "*/" встречен, затем один способ сделать это был бы этим (как обычно, regex не подходит для вложенных структур, таким образом, вложенные комментарии блока не работают):

/\*(.(?!\*/))*.?\*/             // run this in single line (dotall) mode

По существу это говорит: "/*", сопровождаемый чем-либо, что самим не сопровождается "*/", сопровождаемый "*/".

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

/\*.*?\*/                       // run this in single line (dotall) mode

Нежадное соответствие как это имеет потенциал, чтобы пойти не так, как надо в пограничном случае - в настоящее время я не могу думать о том, где это выражение могло бы перестать работать, но я не совсем уверен.

1
ответ дан 3 December 2019 в 14:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: