2013-08-13 2 views
2

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

Пример TestCase:

#include <stdio.h> 
#include <stdlib.h> 
#include <foo_file.h> 

int myint = atoi(foostring1); 

float myfloat = atof(foostring2); 

int myint2 = atoi(foostring3); 

использования:

  1. строка содержит atof и
  2. строка оленья кожа содержит строку stdlib.h
  3. Группы DonT значения. Я просто хочу знать, существует ли строка или нет.

С регулярным выражением

(?=^#include <stdlib.h>).*atof 

я могу найти, если файл содержит STDLIB заголовок и atof. Прекрасно работает. Однако я не могу показаться, чтобы получить отрицательный взгляд вперед регулярное выражение, как

(?!(?=.*^#include <stdlib.h>)).*(atoi) 

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

Пусть движок регулярных выражений в среде IDE я использую позволяет подобрать по новой/линии возврата символов и позволяет мне выбрать то, что регулярное выражение парсер/двигатель я хочу использования (но обычно я использую в Perl)

+0

Что такое * negative look forward * regex должен уступить? – acdcjunior

+0

Попробуйте добавить '\ A' в начало вашего регулярного выражения. –

ответ

1

Проблема что ваше совпадение может начинаться в любом месте строки. В частности, вы найдете матч после#include stdlib.h. Смотрище тогда не находит больше stdlib.h, и совпадение будет успешным. Многие ароматы регулярных выражений обеспечивают \A в соответствии с началом строки (и только там) независимо от многострочного режима. Таким образом, чтобы заставить предпросмотр просматривать всю строку, сделайте следующее:

\A(?!.*^#include <stdlib[.]h>).*(atoi) 

Обратите внимание, что вам не нужно гнездо другого опережения внутри.

Также обратите внимание, что это произойдет, даже если #include является послеatoi. Если это не требуется, в основном существуют два решения:

Если вы можете выбрать вкус регулярных выражений .NET, вы можете превратить это в назад ':

(?<!^#include <stdlib[.]h>.*)atoi 

Другие ароматы не допустит этого, потому что они требуют lookbehind должны иметь фиксированную ширину.

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

\A(?:(?!^#include <stdlib[.]h>).)*(atoi) 

Так что (?:...) группу коллективов произвольный характер вместе с представлением для этой конкретной позиции, и все это повторяется.

+0

Ваше регулярное выражение не соответствует моей usecase. Я запустил все регулярное выражение, которое вы указали через regexbuddy без каких-либо успехов для моих перечисленных выше тестовых данных. – user1536029

+0

@ user1536029 Вы используете модификатор 'm' и' s'? Первый и третий работают отлично на http://regex101.com/, например (который использует PCRE). –

+0

Я только что попробовал свой тестовый пример на regex101.com. Я копирую первое и третье регулярное выражение в «Ваше регулярное выражение», и это не работает. Попробуйте изменить «#include » на «#include ». Это тестовый пример, который мне нужен. был использован atoi и «#include » не был включен выше использования atoi. – user1536029

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