|
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
|
|
|
В ответ на:
выбирает значения, не попадающие в этот
egrep -v "regex" "file", зачем париться.
|
(living in parentheses) |
|
|
olleg
|
|
\o\O
|
|
|
|
|
|
|
Рег.: 01.09.2005
|
|
Сообщений: 2321
|
|
|
|
Рейтинг: 3725
|
|
|
code: /^(?!aaaa:21[012][01235]).{9}$/
для твоего примера можно так
|
Zhaka Taka |
|
|
alcogolic
|
|
anonymous
|
|
|
|
|
|
|
Рег.: 01.06.2005
|
|
Сообщений: 1678
|
|
|
|
Рейтинг: 2109
|
|
|
Это нужно не для 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
|
|
|
вот отрывок из хорошей книжки:
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
|
|
|
--- тут была написана глупость, удалено ---
|
_______ Мой ник читается "Хамаль" |
|
|
maloi
|
|
Зануда
|
|
|
|
|
|
|
Рег.: 09.05.2006
|
|
Сообщений: 6506
|
|
Из: $(pwd)
|
|
Рейтинг: 2880
|
|
|
ну, вот у меня например он матчит "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
|
|
|
есть подозрение что в общем случае это алгоритмически неразрешимо, но для конечных языков все точно не так печально. =)
|
13/37 =) |
|
|
Druxa
|
|
Дрюха
|
|
|
|
|
|
|
Рег.: 27.06.2003
|
|
Сообщений: 2722
|
|
Из: Троицк
|
|
Рейтинг: 1974
|
|
Re: Инвертировать regexp
[re: blind]
02.03.2009 21:51
|
|
|
> есть подозрение что в общем случае это алгоритмически не разрешимо на самом деле разрешимо. регулярные выражения эквивалентны конечным автоматам, а построить отрицание конечного автомата очень просто, надо поменять терминальные и нетерминальные вершины местами.
|
нет, я не богат... я сказочно не богат... но я и не умен... |
|
|
blind
|
|
still alive
|
|
|
|
|
|
|
Рег.: 16.01.2004
|
|
Сообщений: 23128
|
|
Из: Хамовники
|
|
Рейтинг: 16483
|
|
Re: Инвертировать regexp
[re: Druxa]
02.03.2009 21:55
|
|
|
|
|
|
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
|
|
|
ну построй по регулярному выражению конечный автомат, преобразуй его, и обратно переведи в регулярное выражение
|
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 |
|