Nano Hash - криптовалюты, майнинг, программирование

Удалить многострочный стиль C / * комментарии * / с помощью регулярного выражения Perl

Как удалить многострочные комментарии в стиле C, например:

/* comments
   comments
   comments
   comments */

Я могу удалить комментарии в одной строке, например /* comments */, используя несколько кодов, указанных в других вопросах.

s#/\*[\s\S]*?\*/##sg;
s#/\*(.*?)\*/##sg;
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse

Все три приведенных выше регулярных выражения не работают с многострочными комментариями. Как с ними справиться?

29.12.2014

  • Вам нужно иметь дело с незаконными комментариями C, такими как /\ в одной строке, \ в следующей и * comment *\ в следующей, еще одна строка, состоящая только из \, и, наконец, / в следующей строке, отмечая конец комментария? Вам нужно разрешить запись любой из этих обратных косых черт ??/ вместо \? 29.12.2014
  • Мне удалось удалить однострочные комментарии типа // something. Тем не менее, я не очень уверен в обратных косых чертах, которые вы упомянули, извините, кодирование новичка здесь;) 29.12.2014
  • Хорошо. Это также относится к многострочным // something\ строкам с continuation of previous comment на следующей строке? Если вы новичок в этом вопросе, вы можете решить, что нелепые комментарии выходят за рамки, не в последнюю очередь потому, что любой, кто действительно их пишет, заслуживает того, чтобы его повесили, нарисовали и четвертовали за злоупотребление C (или C ++, или Java, или что-то еще. язык действительно есть). Тем не менее, это та чушь, с которой приходится иметь дело разработчикам компиляторов. 29.12.2014
  • @AvinashRaj: ну, во-первых, комментарии могут начинаться в конце одной строки и продолжаться на последующих строках. Кроме того, в какой-то момент вам придется беспокоиться о: const char c_start[] = "/*"; const char c_end[] = "*/";, который не содержит комментариев. У вас может быть даже непереносимый код, например int c1 = '/*'; int c2 = '*/';, который также не содержит комментариев. Совершенно нетривиально выполнить эту работу досконально. Тем не менее, подобные вещи могут выходить за рамки того, что OP должен обрабатывать, и он может поблагодарить своих счастливчиков за то, что не выпускает средство для удаления комментариев коммерческого уровня. 29.12.2014
  • Я понимаю, что вы имели в виду раньше. Мне не нужно обрабатывать эти комментарии. Моя задача содержит только многострочные /*something*/ и //something. 29.12.2014
  • Ответ находится в FAQ: perldoc.perl.org/? 30.12.2014

Ответы:


1

Я бы хотел,

perl -0777pe 's/\/\*(?:(?!\*\/).)*\*\/\n?//sg' file

Пример:

$ cat fi
/* comments
   comments
   comments
   comments */
bar
$ perl -0777pe 's/\/\*(?:(?!\*\/).)*\*\/\n?//sg' fi
bar
29.12.2014
  • Однострочник работает, если я набираю его в командном окне. Однако я должен открыть текстовый файл и удалить в нем комментарии. s/\/\*(?:(?!\*\/).)*\*\/\n?//sg foreach (@lines) удаляет однострочные комментарии, но не многострочные комментарии. Любые идеи? 29.12.2014
  • Я думаю, что цикл foreach будет извлекать только одну строку за раз. 29.12.2014
  • Почему вы используете режим абзаца -00? Вы хотели использовать режим slurp -0777? 29.12.2014
  • да, 00pe не будет работать, если между /* и */ будет пустая строка 29.12.2014
  • Теперь я вижу, в чем мои проблемы! Есть ли способ проверить файл построчно при удалении комментариев без использования foreach / for? 29.12.2014
  • просто прочтите весь файл в строку и произведите замену в этой строке. stackoverflow.com/questions/953707/ 29.12.2014
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..