2011-01-26 2 views
1

У меня возникают проблемы с синтаксисом регулярных выражений.Соответствующий образец без комментариев в eclipse

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

Комментарии являются (несколько) # или ## или ### ...

Примеры:

#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).

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

ответ

3

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

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

Так что вы хотите здесь, чтобы соответствовать строке, начинающейся с любого символа, за исключением #. (Я думаю.)

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

+0

Имеет смысл ... +1 – DVK

+0

Вы правы с неправильным использованием '[]'. Я не думаю, что в моем случае есть использование # в строке, где это ** не ** комментарий. И даже если бы они были, я мог бы пренебречь этими случаями. – Pit

2

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

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

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

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

+0

Поскольку я прокомментировал ответ Саймона, я не думаю, что использование '#' не является чем-то, кроме комментариев, и даже в этом случае я мог бы пренебречь этими случаями. Я неплохо пропустить некоторые ** правые ** совпадения, я просто хочу исключить большинство ** ложных ** (ака. Комментариев) матчей. – Pit

+0

@Pit - это зависит от вашей цели. 90 +% от моего кода, вроде этого, намного хуже, чем пропустить действительное совпадение, чем иметь 10 ложных срабатываний :) – DVK

0

Конечно, если вы знаете об этих проблемах и все еще хотите использовать 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 
+0

Это не работает для меня; Может быть, что-то было потеряно при копировании рисунка? Первые 6 символов, являющиеся ** жирным шрифтом **, могут указывать на это. – Pit

+0

Я исправил указанное выше выражение. Тесты, которые я провел в Kodos, который подходит для Python, хотя регулярное выражение также должно работать для perl. –

+0

Не работает. Что должно делать «[$;] +»? Только совпадение, если достигнут конец линии или команда окончена? – Pit

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