2009-12-16 3 views
0

У меня есть текстовый файл, в том числе ниже строки:Строка соответствия для/* и */

/* MY TXT File LINE */ 
/* MY TXT File LINE MORE */ 

constant private FileName = <A "C:\\TMP\\ALARM.TXT"> 

constant ConfigAlarms = <U1 0> /* Comment Here*/ 

я не знаю, как разделить строки комментариев (/* something */):

LINE1:

/* MY TXT File */ 

LINE2: (. acturally я не думаю, что линия действительно комментарий линия)

constant ConfigAlarms = <U1 0> /* Comment Here*/ 

мой код ниже.

if ($val =~ /\/\*/){ 
    print "<!-- $line -->"; 
    print "\n"; 
} 

LINE1 и LINE2 будут рассматриваться как комментарий.

Я нашел googled и нашел информацию ниже.

^f  # f at the beginning of a line 
^ftp # ftp at the beginning of a line 
e$  # e at the end of a line 
tle$ # tle at the end of a line 

, но я не знаю, как совместить /* с характером ^ и $ улучшить свой код, чтобы разобрать строку, начинающуюся с /* и заканчиваются */

Спасибо.

+1

Я должен спросить, почему вы пытаетесь разобрать '/ *' и '* /'? Если вы разбираете какой-то скрипт с использованием нового языка, вы должны создать специализированный парсер для этого языка. файл конфигурации, используйте один из хорошо установленных форматов, таких как YAML или JSON. – Ether

+0

Я планирую конвертировать t файл txt большого размера в файл XML. В файле txt есть несколько строк * */комментариев. я должен разобрать его и добавить XML-комментарий «» style. Легче читать новый файл XML-файла. –

ответ

4
m{^/\*.*\*/$} 

будет соответствовать линии, которые имеют /* как первые два символа и */ как их два последних.

+1

@Nano, важно отметить, что предложение Anon использует {} вместо // в регулярном выражении. Это облегчает чтение регулярного выражения. – pavium

+1

Также обратите внимание, что, как и большинство решений regex, это не сработает, если в вашем исходном коде есть строка, содержащая ''/* comments */''. Если это проблема, парсер в порядке. –

+0

/* MY TXT File */- Между * и M нет пробела, теперь он работает хорошо. /* MY TXT File */- Существует одно или несколько пробелов между * и M, это не работает. Как с этим обращаться? Благодарю. –

2

См. Это FAQ. Вместо того, чтобы игнорировать текст, соответствующий данному шаблону, захватите его.

В качестве альтернативы, вы можете дать String::Comments::Extract выстрел. См. [String::Comments::Extract::C->collect(<source>)] (http://search.cpan.org/perldoc/String::Comments::Extract#String::Comments::Extract::C-%3Ecollect(%3Csource%3E)

2

Существует невероятное модуль CPAN, который может помочь с этим, Regexp::Common::comment Используя это невероятно легко:.

use Regexp::Common qw /comment/; 

while (<>) { 
    /$RE{comment}{C}/  and print "Contains a C comment\n"; 
    /$RE{comment}{C++}/  and print "Contains a C++ comment\n"; 
    /$RE{comment}{PHP}/  and print "Contains a PHP comment\n"; 
    /$RE{comment}{Java}/ and print "Contains a Java comment\n"; 
    /$RE{comment}{Perl}/ and print "Contains a Perl comment\n"; 
    /$RE{comment}{awk}/  and print "Contains an awk comment\n"; 
    /$RE{comment}{HTML}/ and print "Contains an HTML comment\n"; 
} 

use Regexp::Common qw /comment RE_comment_HTML/; 

while (<>) { 
    $_ =~ RE_comment_HTML() and print "Contains an HTML comment\n"; 
} 

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

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