Как я могу разделить мультилинию C комментарии из файла с помощью Perl?

Вы можете получить хотя бы немного проще, если сохраните id в массиве и переберите этот массив:

ids = ["1", "2", "3"];

HTML:

Ваш [ 119] StackBlitz

Но это может быть правильным местом для директивы, так что посмотрите на это: Официальные документы

5
задан brian d foy 26 May 2009 в 16:27
поделиться

6 ответов

Including tests:

use strict;
use warnings;
use Test::More qw(no_plan);
sub strip_comments {
  my $string=shift;
  $string =~ s#/\*.*?\*/##sg; #strip multiline C comments
  return $string;
}
is(strip_comments('a/* comment1 */  code   /* comment2 */b'),'a  code   b');
is(strip_comments('a/* comment1 /* comment2 */b'),'ab');
is(strip_comments("a/* comment1\n\ncomment */ code /* comment2 */b"),'a code b');
-3
ответ дан 18 December 2019 в 05:40
поделиться

Как часто бывает в Perl, вы можете обратиться к CPAN: Regexp :: Common :: Comment должен вам помочь. Я обнаружил, что один язык, в котором используются описанные вами комментарии, - это Nickle, но, возможно, комментарии PHP подойдут (// также можно начинать однострочный комментарий).

Обратите внимание, что в любом случае использование регулярных выражений для удаления комментария является опасно, полный синтаксический анализатор языка гораздо менее рискован. Например, парсер регулярных выражений может запутаться, увидев что-то вроде print "/*";[1151865 impression.

11
ответ дан 18 December 2019 в 05:40
поделиться

Это FAQ:

perldoc -q comment

Найдено в ] perlfaq6 :

Как использовать регулярное выражение для удаления комментариев в стиле C из файла?

Хотя это действительно можно сделать, это намного сложнее, чем вы думаете. Для Например, этот однострочный ...

6
ответ дан 18 December 2019 в 05:40
поделиться

Удалить / * * / комментарии (в том числе многострочные)

s/\/\*.*?\*\///gs

Я публикую это, потому что это просто, однако я считаю, что это может споткнуться о встроенных комментариях, таких как

/* sdafsdfsdf /*sda asd*/ asdsdf */

Но поскольку они довольно редки, я предпочитаю простое регулярное выражение.

0
ответ дан 18 December 2019 в 05:40
поделиться

Из perlfaq6 «Как использовать регулярное выражение для удаления комментариев в стиле C из файла?»:


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

perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c

будет работать во многих, но не во всех случаях. Видите ли, это слишком простовато для определенных типов программ на C, в частности, для тех, которые кажутся комментариями в строках в кавычках. Для этого вам понадобится что-то вроде этого, созданное Джеффри Фридлом и позднее измененное Фредом Кертисом.

$/ = undef;
$_ = <>;
s#/\*[^*]*\*+([^/*][^*]*\*+)*/|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $2 ? $2 : ""#gse;
print;

Это, конечно, можно было бы написать более разборчиво с помощью модификатора / x, добавив пробелы и комментарии. Здесь он расширен, любезно предоставлен Фредом Кертисом.

s{
   /\*         ##  Start of /* ... */ comment
   [^*]*\*+    ##  Non-* followed by 1-or-more *'s
   (
     [^/*][^*]*\*+
   )*          ##  0-or-more things which don't start with /
               ##    but do end with '*'
   /           ##  End of /* ... */ comment

 |         ##     OR  various things which aren't comments:

   (
     "           ##  Start of " ... " string
     (
       \\.           ##  Escaped char
     |               ##    OR
       [^"\\]        ##  Non "\
     )*
     "           ##  End of " ... " string

   |         ##     OR

     '           ##  Start of ' ... ' string
     (
       \\.           ##  Escaped char
     |               ##    OR
       [^'\\]        ##  Non '\
     )*
     '           ##  End of ' ... ' string

   |         ##     OR

     .           ##  Anything other char
     [^/"'\\]*   ##  Chars which doesn't start a comment, string or escape
   )
 }{defined $2 ? $2 : ""}gxse;

Небольшая модификация также удаляет комментарии C ++, возможно, охватывающие несколько строк с использованием символа продолжения:

 s#/\*[^*]*\*+([^/*][^*]*\*+)*/|//([^\\]|[^\n][\n]?)*?\n|("(\\.|[^"\\])*"|'(\\.|[^'\\])*'|.[^/"'\\]*)#defined $3 ? $3 : ""#gse;
16
ответ дан 18 December 2019 в 05:40
поделиться

Существует также не-Perl ответ: используйте программу stripcmt :

StripCmt - это простая утилита, написанная в C, чтобы удалить комментарии из C, C ++, и исходные файлы Java. В большом традиция обработки текста Unix программ, он может функционировать как Фильтр FIFO (First In - First Out) или принимать аргументы в командной строке.

1
ответ дан 18 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

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