Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.snto-msu.net/showflat.php?Number=8407237&src=arc&showlite=
Дата изменения: Unknown
Дата индексирования: Wed Apr 13 02:17:11 2016
Кодировка: Windows-1251
Инвертировать regexp - Public forum of MSU united student networks
Root | Google | Yandex | Mail.ru | Kommersant | Afisha | LAN Support
  
Technical >> Development (Archive)

Страницы: 0 | 20 | показать все | след. страница
alcogolic
anonymous

Рег.: 01.06.2005
Сообщений: 1678
Рейтинг: 2109
  Инвертировать regexp
      02.03.2009 10:56
 

Есть regexp, который позволяет выбирать нужные значения. Для конкретики, это "^aaaa:21[012][01235]$"
Как бы проще построить regexp, который выбирает значения, не попадающие в этот? Что-то у меня не получается просто взять и инвертировать его, и в голову приходят только идеи вида раскрыть этот regexp и выписать все варианты с префиксом инвертирования.



'НИКАКИХ КРЫЛЬЕВ НЕТ. ПРОСТО УМИРАЕШЬ И ВСЕ' Гусеница
ManMachine
1KB MEMORY OK

Рег.: 19.09.2006
Сообщений: 10837
Из: $HOME
Рейтинг: 8217
  Re: Инвертировать regexp [re: alcogolic]
      02.03.2009 11:10
-1

В ответ на:

выбирает значения, не попадающие в этот




egrep -v "regex" "file", зачем париться.



(living in parentheses)
olleg
\o\O

Рег.: 01.09.2005
Сообщений: 2321
Рейтинг: 3725
  Re: Инвертировать regexp [re: alcogolic]
      02.03.2009 11:13
2

code:
/^(?!aaaa:21[012][01235]).{9}$/

для твоего примера можно так



Zhaka Taka
alcogolic
anonymous

Рег.: 01.06.2005
Сообщений: 1678
Рейтинг: 2109
  Re: Инвертировать regexp [re: ManMachine]
      02.03.2009 11:17
 

Это нужно не для grep-а, это нужно для построения фильтра, которому надо скармливать regexp



'НИКАКИХ КРЫЛЬЕВ НЕТ. ПРОСТО УМИРАЕШЬ И ВСЕ' Гусеница
alcogolic
anonymous

Рег.: 01.06.2005
Сообщений: 1678
Рейтинг: 2109
  Re: Инвертировать regexp [re: olleg]
      02.03.2009 11:30
 

С конструкцией ?! еще ни разу не сталкивался, нашел ее в Википедии, сейчас буду осмысливать. :)
Другой вопрос, поддерживает ли моя железка такие конструкции, это буду выяснять экспериментом.
Но в любом случае полезно знать, и, может быть, пригодиться когда буду программировать.



'НИКАКИХ КРЫЛЬЕВ НЕТ. ПРОСТО УМИРАЕШЬ И ВСЕ' Гусеница
olleg
\o\O

Рег.: 01.09.2005
Сообщений: 2321
Рейтинг: 3725
  Re: Инвертировать regexp [re: alcogolic]
      02.03.2009 11:40
2

вот отрывок из хорошей книжки:

Zero-width negative look-ahead assertion. The enclosed pattern must
not match for the assertion to succeed. As with the positive variant,
match text is not consumed.
This pattern can be very tricky indeed to use correctly, and reaching for
it often indicates we need to rethink the design of our search pattern.
Firstly, because the assertion is zero width, we do not absorb any match
text even if it is satisfied, so we must take that into account in the
pattern immediately following. For example, this text attempts to make
sure the last three characters of a string are not 'abc'. But it doesn't
work:
$text=~/(?!abc)$/; # ERROR: always succeeds, even if $text ends
in 'abc'
This assertion will succeed at the very end of the match text, because at
the end there are no characters left, and this does satisfy the condition.
It will still satisfy the condition even if the last three characters really
were 'abc'. To have this assertion work as intended, we need to provide
a positive-width pattern for the text that isn't 'abc' to match:
$text=~/(?!abc)...$/; # OK - note the '...'
The trailing dots change the meaning of this pattern from 'check the
end is not 'abc''' to 'look for three characters at the end which are not
'abc'.' While these parse the same to a human, the literal-minded
regular expression engine needs the extra clarification.
Secondly, alternatives do not work as might be expected inside this
assertion. For instance, we cannot say 'neither 'a' nor 'b'' with
$text=~/^(?!a|b)/;
# ERROR: matches any character
This actually says 'not a' or 'not b'. Since 'a' is not 'b', and 'b' is not 'a',
anything at all will satisfy one of these conditions and the assertion will
always succeed.
Like its positive counterpart, this pattern is zero width, so it does
not affect Perl's special regular expression variables, backreferences,
or number variables.




Zhaka Taka
maloi
Зануда

Рег.: 09.05.2006
Сообщений: 6506
Из: $(pwd)
Рейтинг: 2880
  Re: Инвертировать regexp [re: olleg]
      02.03.2009 20:04
 

>/^(?!aaaa:21[012][01235]).{9}$/


это у тебя где такой регексп работает инвертированием вышенаписанного?



Помни: убив анимешника, ты повышаешь скорость сети на 5%
kernel386
Seraph

Рег.: 06.03.2006
Сообщений: 3920
Из: Gevurah
Рейтинг: 2058
  Re: Инвертировать regexp [re: maloi]
      02.03.2009 20:20
-1

--- тут была написана глупость, удалено ---



_______
Мой ник читается "Хамаль"
maloi
Зануда

Рег.: 09.05.2006
Сообщений: 6506
Из: $(pwd)
Рейтинг: 2880
  Re: Инвертировать regexp [re: kernel386]
      02.03.2009 20:23
 

ну, вот у меня например он матчит "aaaaaaaaa" но не матчит "Hello World"
есть подозрение, что .{9} задает жесткую длину в 9 символов.


>везде, где поддерживаются lookaround'ы

в js,grep,perl - хоть в одном из них они поддерживаются?
а то я не знаю что это такое.



Помни: убив анимешника, ты повышаешь скорость сети на 5%
kernel386
Seraph

Рег.: 06.03.2006
Сообщений: 3920
Из: Gevurah
Рейтинг: 2058
  Re: Инвертировать regexp [re: maloi]
      02.03.2009 20:34
 

в перле поддерживаются

признаю, я написал чушь, но как бы слово "фильтр" наводит на мысль, что на вход подаются форматные данные, и возможно, автору этого решения будет достаточно



_______
Мой ник читается "Хамаль"
blind
still alive

Рег.: 16.01.2004
Сообщений: 23128
Из: Хамовники
Рейтинг: 16483
  Re: Инвертировать regexp [re: alcogolic]
      02.03.2009 21:04
-2

есть подозрение что в общем случае это алгоритмически неразрешимо, но для конечных языков все точно не так печально. =)




13/37 =)
Druxa
Дрюха

Рег.: 27.06.2003
Сообщений: 2722
Из: Троицк
Рейтинг: 1974
  Re: Инвертировать regexp [re: blind]
      02.03.2009 21:51
5

> есть подозрение что в общем случае это алгоритмически не разрешимо
на самом деле разрешимо. регулярные выражения эквивалентны конечным автоматам, а построить отрицание конечного автомата очень просто, надо поменять терминальные и нетерминальные вершины местами.



нет, я не богат... я сказочно не богат... но я и не умен...
blind
still alive

Рег.: 16.01.2004
Сообщений: 23128
Из: Хамовники
Рейтинг: 16483
  Re: Инвертировать regexp [re: Druxa]
      02.03.2009 21:55
2

ога



13/37 =)
olleg
\o\O

Рег.: 01.09.2005
Сообщений: 2321
Рейтинг: 3725
  Re: Инвертировать regexp [re: maloi]
      02.03.2009 22:37
 

ну да, там надо ^ и $ засунуть во внутрь скобочек:
/(?!^aaaa:21[012][01235]$).{9}/



Zhaka Taka
maloi
Зануда

Рег.: 09.05.2006
Сообщений: 6506
Из: $(pwd)
Рейтинг: 2880
  Re: Инвертировать regexp [re: olleg]
      02.03.2009 22:42
 

ну и, теперь попробуй туда подставить "Hello", стало совсем чуть-чуть получше, но все равно неправильно.



Помни: убив анимешника, ты повышаешь скорость сети на 5%
olleg
\o\O

Рег.: 01.09.2005
Сообщений: 2321
Рейтинг: 3725
  Re: Инвертировать regexp [re: maloi]
      02.03.2009 23:00
 

да, ты прав. все строки, короче девяти символов заваливают тест



Zhaka Taka
maloi
Зануда

Рег.: 09.05.2006
Сообщений: 6506
Из: $(pwd)
Рейтинг: 2880
  Re: Инвертировать regexp [re: olleg]
      02.03.2009 23:01
 

/((?!^aaaa:21[012][01235]$).{9})|^.{1,8}$/
что-нибудь такое?



Помни: убив анимешника, ты повышаешь скорость сети на 5%
gadfatherАдминистратор
Carpal Tunnel

Рег.: 05.11.2003
Сообщений: 47302
Из: пл. Гагарина
Рейтинг: 16961
  Re: Инвертировать regexp [re: alcogolic]
      02.03.2009 23:05
5

ну построй по регулярному выражению конечный автомат, преобразуй его, и обратно переведи в регулярное выражение



You can't always get what you want
Sevurrrra
Хранитель маяка

Рег.: 10.09.2007
Сообщений: 2050
Рейтинг: 2759
  Re: Инвертировать regexp [re: maloi]
      02.03.2009 23:05
 

look-around'ом такое делать - бредятина и лишний геморрой. Чем извращаться с подсовыванием десятка возможных вариантов в регэксп (если хочется пудрить себе мозг look-around'ом, для такой строки придется рассмотреть все варианты от (?!^aaaa:21[012][01235]$) до (?<!^aaaa:21[012][01235]$) ). Гораздо более разумно брать результат проверки и инвертировать, в любом языке это как бы легко реализуется, достаточно уточнить, на чем пишется фильтр:
perl:
code:
if ($s !~ /^aaaa:21[012][01235]$/) { ... }

php:
code:
if (!preg_match("/^aaaa:21[012][01235]$/", $s) { ... }

grep уже написали выше
и т.д.
И работать это будет намного быстрее, чем тот же look-around.


olleg
\o\O

Рег.: 01.09.2005
Сообщений: 2321
Рейтинг: 3725
  Re: Инвертировать regexp [re: maloi]
      02.03.2009 23:13
 

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



Zhaka Taka
Страницы: 0 | 20 | показать все | след. страница

Technical >> Development (Archive)

Дополнительная информация
0 зарегистрированных и 0 анонимных пользователей просматривают этот форум.

Модераторы:  DarkGray 

Печать темы
>>
Права
      Вы можете создавать новые темы
      Вы можете отвечать на сообщения
      HTML отключен
      UBBCode включен

Рейтинг:
Просмотров темы:

Переход в