Соответствие некомментированному шаблону в затмении - PullRequest
1 голос
/ 26 января 2011

У меня проблемы с синтаксисом регулярных выражений.

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

Комментарии (множественные) # или ## или ### ...

Примеры:

#This is a comment  <- no match

#This is a comment myword 8 <- no match

my $var = 'myword 12'; <- match

my $var2 = 'myword'; <- no match

До сих пор у меня есть
рисунок паттерна: ^[^(\#+)](.*?)(myword \d+)(.*?)$
новый шаблон: ^([^\#]*?)(myword\s+\d+)(.*?)$

Которые должны соответствовать строкам, которые не начинаются с одного или нескольких символов #, за которыми следует что-то, а затем комбинация номеров слов, которую я ищудля и, наконец, что-то.

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

my  $var3 = 'test';#myword 8 <- no match

Что я делаю неправильно?

Я хочу использовать его в поиске файлов Eclipse (с эпическим модулем Perl).

Редактировать: Новый полученный мной шаблон не возвращает ложных совпадений, но возвращаетумножьте строку, которая включает myword и на несколько строк перед этой строкой.И я не уверен, что он возвращает все совпадения.

Ответы [ 3 ]

3 голосов
/ 26 января 2011

Обратите внимание, что [] являются классами символов.Вы не можете использовать квантификаторы там.Они похожи на . - соответствует любому персонажу, указанному там.Саму точку, или класс символов , можно определить количественно.

В вашем примере [^(#+)] будет соответствовать всему, кроме (, ), + и в зависимости от вкуса (я думаю) #и \.

Итак, вам нужно сопоставить строку, начинающуюся с любого символа, кроме #.(Я думаю.)

Проблема в том, что # может встречаться в строке, где это не комментарий.(Относительно комментариев, которые не начинаются в начале строки.)

2 голосов
/ 26 января 2011

Re: комментарии не в начале строки.

Чтобы сделать это правильно (например, чтобы не пропустить ни одного действительного совпадения), вам в значительной степени необходимо правильно проанализировать грамматику конкретного языка программирования файла, поэтому вы не можете сделать это (легко или даже вообще) ) с RegEx.

Если вы этого не сделаете, вы рискуете пропустить действительные поисковые запросы, которые следуют за "#", используемым в контексте, отличном от начала комментария - как пример, общий для практически любого языка, после строки "this is my #hash".

Еще хуже в Perl, где "#" также может отображаться как разделитель регулярных выражений, как $#myArr (индекс последнего элемента массива) или - радость радости - как действительный символ в имени идентификатора. !

0 голосов
/ 26 января 2011

Конечно, если вы знаете об этих проблемах и по-прежнему хотите использовать regexp для извлечения контента. Примерно так может быть полезно:

^[^\#].[^\n\#]+myword\s\d+.[$;]+

Это немного сложно, но я надеюсь, что это сработает для Вас. Для меня это соответствует, как показано ниже:

my $var = 'myword 12'; <- match
my $var = 'myword 17'; <- match
my $var2 = 'myword'; <- no match
my $var = 'myword 9'; #'myword 17'; <- partly match
my $var = 'myword 8'; ##'myword 127'; <- partly match
my $var = ;#'myword 17'; <- no match
#my $var = 'myword 13'; <- no match
##my $var2 = 'myword 14'; <- no match
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...