Regex question.

Palych
Уже с Приветом
Posts: 13723
Joined: 16 Jan 2001 10:01

Regex question.

Post by Palych »

How to negate matching of some word?
Something like

Code: Select all

Begin[^"End"]End

Here is the actual text I need to match:

Code: Select all

SunOS 5.8
Some labuda
Another labuda
login:


Any ideas?
User avatar
WildVlad
Уже с Приветом
Posts: 3982
Joined: 13 Jul 2000 09:01
Location: SVX -> BOS -> BUR -> SJC

Post by WildVlad »

Вот хороший tutorial - займёт минут 20 чтобы всё прочитать:
http://www.regular-expressions.info/tutorial.html
I hated LA
User avatar
WildVlad
Уже с Приветом
Posts: 3982
Joined: 13 Jul 2000 09:01
Location: SVX -> BOS -> BUR -> SJC

Post by WildVlad »

Для вашего примера подойдет и:

Code: Select all

Sun(.|\n|\r)*login:

потому что звёздочка жадная, а точка не включает перевод строки, даже negation не надо делать :)
Но если хоите nagation, то

Code: Select all

Begin(^(End))*End
Хотя я не уверен, что это сработает
I hated LA
Palych
Уже с Приветом
Posts: 13723
Joined: 16 Jan 2001 10:01

Post by Palych »

WildVlad wrote:

Code: Select all

Begin(^(End))*End
Хотя я не уверен, что это сработает

Eto tochno ne zarabotaet.

Code: Select all

^SunOS[ ][0-9][^l]*[^o]*[^g]*[^i]*[^n]*[^:]*login:

Kinda works...
User avatar
WildVlad
Уже с Приветом
Posts: 3982
Joined: 13 Jul 2000 09:01
Location: SVX -> BOS -> BUR -> SJC

Post by WildVlad »

dup
Last edited by WildVlad on 18 Aug 2004 22:23, edited 1 time in total.
I hated LA
User avatar
WildVlad
Уже с Приветом
Posts: 3982
Joined: 13 Jul 2000 09:01
Location: SVX -> BOS -> BUR -> SJC

Post by WildVlad »

Palych wrote:

Code: Select all

^SunOS[ ][0-9][^l]*[^o]*[^g]*[^i]*[^n]*[^:]*login:

Kinda works...

Не, фигня какая-то получается:
[^l] матчит любую букву кроме l любое количество раз соотвественно
SunOS l login:
тоже сработает, потому как [^l] будет заматчено ровно ноль раз, а потом заматчится следующий паттер ([^o]*) 1 раз и все остальные по 0 раз.

Более того, для SunOS login: login: заматчится тоже весь текст целиком и не понятно зачем писать эту кучу отрицаний.

Тогда уж проще с SunOS (.|\n|\r)*login: - так как * жадная, то она сожрёт сколько можно и оба примера сверху сработают точно также как и в Вашем случае. По идее, | можно было бы не ставить, если знать, что текст не содержит переводов строк.
I hated LA
Palych
Уже с Приветом
Posts: 13723
Joined: 16 Jan 2001 10:01

Post by Palych »

WildVlad wrote:...
Более того, для SunOS login: login: заматчится тоже весь текст целиком...

Ne-a, zamatchitsya tol'ko 'SunOS login:'
ig
Уже с Приветом
Posts: 491
Joined: 09 Apr 2000 09:01
Location: Tigard, OR

Post by ig »

По-моему как раз нужна нежадная звёздочка. Пример для perl:

Code: Select all

 /SunOS(.*?)login:/s

А какие regexps используете?
Palych
Уже с Приветом
Posts: 13723
Joined: 16 Jan 2001 10:01

Post by Palych »

ig wrote:По-моему как раз нужна нежадная звёздочка. Пример для perl:

Code: Select all

 /SunOS(.*?)login:/s

А какие regexps используете?

Flex.
Ono tochno v Perl rabotaet? Zachem tam '?' ?
User avatar
A. Fig Lee
Уже с Приветом
Posts: 12072
Joined: 17 Nov 2002 03:41
Location: английская колония

Post by A. Fig Lee »

Палыч, была такая же проблема - не решил, пролез огородами.
:umnik1:
Верить нельзя никому - даже себе. Мне - можно!
User avatar
WildVlad
Уже с Приветом
Posts: 3982
Joined: 13 Jul 2000 09:01
Location: SVX -> BOS -> BUR -> SJC

Post by WildVlad »

Palych wrote:
WildVlad wrote:...
Более того, для SunOS login: login: заматчится тоже весь текст целиком...

Ne-a, zamatchitsya tol'ko 'SunOS login:'

Так, вопрос тогда ставим так:
Для текста 'SunOS login: login:' что должно быть заматчено???
Звёздочки бывает 2 - жадная (by default) - ест столько много, сколько может - будет заматчена вся строка.
и не-жадная - пример синтаксиса уже был - ест по минимуму - заматчится только 'Sun OS login:'

Примечание: посмотрите как сработает Ваш шаблон в следующем случае:
Sun OS 1 l123 o123 g123 i123 n123 :123 login:
Вместо 123 можете подставить всё что угодно

Сначал будет работать шаблон [^l]*, как только встретится l сменится шаблон на [^o]* и пока не встретится o будет работать он. И так пока не дойдём до шаблона [^:]* который кончится на : и мы будем ожидать 'login:' а встретим только 123!!!

Так что правильный ответ - выбрать нужную по жадности звёздочку :mrgreen:
I hated LA
uncle_Pasha
Уже с Приветом
Posts: 19935
Joined: 30 Aug 2000 09:01
Location: WA

Re: Regex question.

Post by uncle_Pasha »

Palych wrote:Here is the actual text I need to match:

Code: Select all

SunOS 5.8
Some labuda
Another labuda
login:


Any ideas?

В Perl это будет
/^.*SunOS\s5\.8([\r\n]*.*)*login\:/m

Удачи!
Palych
Уже с Приветом
Posts: 13723
Joined: 16 Jan 2001 10:01

Re: Regex question.

Post by Palych »

uncle_Pasha wrote:В Perl это будет
/^.*SunOS\s5\.8([\r\n]*.*)*login\:/m

Удачи!

Интересно.
И как я сразу не догадался поменять порядок!
Будет время - попробую во Flexe. Пока мой вариант работает.
ig
Уже с Приветом
Posts: 491
Joined: 09 Apr 2000 09:01
Location: Tigard, OR

Post by ig »

В flex нет нежадной *, тогда можно создать два шаблона. Для примера, первый шаблон :

Code: Select all

^SunOS 
начинает накапливание в глобальном буфере, а второй:

Code: Select all

^login:
заканчивает.
Good luck
Palych
Уже с Приветом
Posts: 13723
Joined: 16 Jan 2001 10:01

Post by Palych »

Кстати, не знаю как в Perl, а в Flex комбинация типа
^.*something$
^.+something$
не работают, поскольку 's','o','m', etc. попадают под .

Return to “Вопросы и новости IT”