The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Библиотеки, функции)
Изначальное сообщение [ Отслеживать ]

"Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от xintrea email(ok) on 29-Авг-11, 15:57 
Здравствуйте!

Вначале опишу задачу.

Нужно найти соответствие строки по следующему макрокоду:

((НЕ abc)И(НЕ def)И(НЕ ghi))xyz

То есть, строки, удовлетворяющие регвыру, могут выглядеть так:

jklxyz
cbaxyz
adgxyz

Строки, не удовлетворяющие регвыру, выглядят так:

abcxyz
defxyz
ghixyz

Задача: нужно написать выражение, повторяющее поведение приведенного выше макрокода.

PS:

Дело в том, что я не понимаю две вещи:

1. Как в регвырах написать "несоответсвие подстроке". Несоответсвие символу или несоответсвие диапазону символов - это понятно как делать. А как сделать несоответсвие подстроке, например, что-то типа !(abc) - непонятно.

2. Как связывать куски шаблонов через логическую И - тоже непонятно. В регвырах есть только операция ИЛИ.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от Andrey Mitrofanov on 29-Авг-11, 16:03 
> Вначале опишу задачу.
> Нужно найти соответствие строки по следующему макрокоду:
>
((НЕ abc)И(НЕ def)И(НЕ ghi))xyz

Денег-то сколько?...

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от xintrea email(ok) on 29-Авг-11, 16:16 
>> Вначале опишу задачу.
>> Нужно найти соответствие строки по следующему макрокоду:
>>
((НЕ abc)И(НЕ def)И(НЕ ghi))xyz

> Денег-то сколько?...

Чего?

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от Andrey Mitrofanov on 29-Авг-11, 16:35 
>> Денег-то сколько?...
> Чего?

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от xintrea email(ok) on 29-Авг-11, 16:58 
> Ну, ты же работу предагаешь?

Составить регвыр - это уже работой зовётся?


> Решение никому не нужной задачи неподходящими средствами.

Поиск подстроки в строке по условию. Какое другое средство применять вместо регвыра?

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

8. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от Andrey Mitrofanov on 29-Авг-11, 17:22 
>> Ну, ты же работу предагаешь?
> Составить регвыр - это уже работой зовётся?
>> Решение никому не нужной задачи неподходящими средствами.
> Поиск подстроки в строке по условию. Какое другое средство применять вместо регвыра?

Чё ж ты сразу-то молчал?! Хошь регексп, на тебе регексп!!

$ cat <<EO |awk 'match($0,"(...)xyz",a)&&a[1]!~"abc|def|ghi"'
> jklxyz
> cbaxyz
> adgxyz
>
> abcxyz
> defxyz
> ghixyz
>
> EO

jklxyz
cbaxyz
adgxyz
$ _

+++Да, я тоже буду читить. И решать криво поставленное, да! Никто, никто ж не заметит!!

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

5. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от XAnder (ok) on 29-Авг-11, 17:08 
Язык не назван, значит будет perl:

m/(?<!abc)(?<!def)(?<!ghi)xyz/

Внутри (?<!...) допустимы только строки постоянной длины, (?<!ab*c) не прокатит.

Andrey Mitrofanov, кончай ворчать, иногда ведь мозг напрячь приятно :-) Хоть и на полминуты, хоть и на пустяшную задачку, хоть и бесплатно.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

6. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от Andrey Mitrofanov on 29-Авг-11, 17:13 
>значит будет perl:
> Внутри (?<!...) допустимы только
> Andrey Mitrofanov, кончай ворчать, иногда ведь мозг напрячь приятно :-) Хоть и
> на полминуты, хоть и на пустяшную задачку, хоть и бесплатно.

:))) Посто на обычном грепе "решение не поместилось на полях этого трактата"(ТМ) -- писать было б долго-нудно-и-противно. И, да, я этих ваших перлов не знаю, поэтому... то ли ты считил, то ли я слил...

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

9. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от xintrea email(ok) on 29-Авг-11, 17:24 
> Язык не назван, значит будет perl:
>
m/(?<!abc)(?<!def)(?<!ghi)xyz/

> Внутри (?<!...) допустимы только строки постоянной длины, (?<!ab*c) не прокатит.

Вот, тут и вылезла проблема.

Оказывается, "отрицательные" строки могут быть разной длинны.  То есть, набор не "abc" "def" "ghi", но и, например, "a" "bc" "def".

Что делать в этом случае?


Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

11. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от XAnder (ok) on 29-Авг-11, 17:59 
>> Внутри (?<!...) допустимы только строки постоянной длины, (?<!ab*c) не прокатит.
> Вот, тут и вылезла проблема.
> Оказывается, "отрицательные" строки могут быть разной длинны.  То есть, набор не
> "abc" "def" "ghi", но и, например, "a" "bc" "def".
> Что делать в этом случае?

Давай-ка сюда полное условие задачи, а то так можно долго рассусоливать.

PS. Правильно поставленный вопрос — уже половина ответа. (кто-то умный сказал)

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

12. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от xintrea email(ok) on 29-Авг-11, 19:29 
> Давай-ка сюда полное условие задачи, а то так можно долго рассусоливать.
> PS. Правильно поставленный вопрос — уже половина ответа. (кто-то умный сказал)

Полное условие слишком большое. Я специально сделал примитивную задачу, чтобы решить основной вопрос поиска таких подстрок. На самом деле там конечно не abc-def-ghi, а более другие подстроки и количество их больше, размер разный. Просто когда придумывал задачу, даже не думал, что может возникнуть ограничение на одинаковость длины подстрок.

Поэтому, правильнее задачу на макроязыке можно переформулировать так:

((НЕ a)И(НЕ bc)И(НЕ def))xyz

На тестовых данных:

abcxyz
defxyz
ghixyz
aaaxyz
bbbxyz
bxyz
kkxyz

Должны быть выбраны строки:

ghixyz
bbbxyz
bxyz
kkxyz

Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

14. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от XAnder (ok) on 30-Авг-11, 08:37 
> а более другие подстроки и количество их больше, размер разный. Просто
> когда придумывал задачу, даже не думал, что может возникнуть ограничение на
> одинаковость длины подстрок.

Нет такого ограничения. Как я писал выше, есть лишь условие, что выражение внутри (?<!...) должно быть постоянной длины.

Тут уж man perlre или http://perldoc.perl.org/perlre.html на предмет "Extended Patterns".

> ((НЕ a)И(НЕ bc)И(НЕ def))xyz

Здесь все строки постоянной длины.

> Должны быть выбраны строки:
> ghixyz
> bbbxyz
> bxyz
> kkxyz

$ perl -e 'for (qw/abcxyz defxyz ghixyz aaaxyz bbbxyz bxyz kkxyz/) {print "$_\n" if m/(?<!a)(?<!bc)(?<!def)xyz/}'
ghixyz
bbbxyz
bxyz
kkxyz

Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

15. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от BJyyewsrhbe tud on 30-Сен-11, 22:29 
> Поэтому, правильнее задачу на макроязыке можно переформулировать так:
>
((НЕ a)И(НЕ bc)И(НЕ def))xyz

Да будет известно, что

(NOT A) AND (NOT B) AND  (NOT C) AND (NOT D) AND ... (NOT Z) == NOT (A AND B AND C AND D AND ... AND Z)  

Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

16. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от Andrey Mitrofanov on 03-Окт-11, 14:10 
> (NOT A) AND (NOT B) AND  (NOT C) AND (NOT
> D) AND ... (NOT Z) == NOT (A AND B AND
> C AND D AND ... AND Z)

Нет, садись - двойка. http://ru.wikipedia.org/wiki/%D0%97%D0%B...

Ответить | Правка | ^ к родителю #15 | Наверх | Cообщить модератору

17. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от pavlinux (ok) on 08-Ноя-11, 05:56 
>> (NOT A) AND (NOT B) AND  (NOT C) AND (NOT
>> D) AND ... (NOT Z) == NOT (A AND B AND
>> C AND D AND ... AND Z)
> Нет, садись - двойка. http://ru.wikipedia.org/wiki/%D0%97%D0%B...

Митрофаныч, а ты наизусть помнишь де Моргана и другие логические комбинации?  


!( !(!A & !B & !С)  | !( !D & !E & !F)  | !( !G & !H & !K)  )  = ?

Ответить | Правка | ^ к родителю #16 | Наверх | Cообщить модератору

18. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от Andrey Mitrofanov on 08-Ноя-11, 18:15 
> Митрофаныч, а ты наизусть помнишь де Моргана и другие логические комбинации?

Чё там помнить-то? Название, "де Моргана", в гугле за минуту нашёл...

> !( !(!A & !B & !С)  | !( !D & !E & !F) | !( !G & !H & !K) )  = ?

= !( A|B|C | D|E|F | G|H|K )
= !A & !B & !C & ... & !K

Хотя, глядя на результат, над был, нверное, снгачала внешнюю скобку "крутить" -
= !!(!A & !B & !С) & !!( !D & !E & !F) & !!( !G & !H & !K)
= !A & !B & !С & !D & !E & !F & !G & !H & !K

Удовлетворён? B)

Ответить | Правка | ^ к родителю #17 | Наверх | Cообщить модератору

19. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от pavlinux (ok) on 08-Ноя-11, 22:51 
>[оверквотинг удален]
> Чё там помнить-то? Название, "де Моргана", в гугле за минуту нашёл...
>> !( !(!A & !B & !С)  | !( !D & !E & !F) | !( !G & !H & !K) )  = ?
> = !( A|B|C | D|E|F | G|H|K )
> = !A & !B & !C & ... & !K
> Хотя, глядя на результат, над был, нверное, снгачала внешнюю скобку "крутить" -
> = !!(!A & !B & !С) & !!( !D & !E &
> !F) & !!( !G & !H & !K)
> = !A & !B & !С & !D & !E & !F
> & !G & !H & !K
> Удовлетворён? B)

!( !(!A & !B & !С)  | !( !D & !E & !F)  | !( !G & !H & !K)  )  =

внешняя скобка раскрывается как

!(!A & !B & !С) & !( !D & !E & !F) & !( !G & !H & !K)

потом тройки

!( !A & !B & !С ) == A | B | C  
!( !D & !E & !F ) == D | E | F
!( !G & !H & !K ) == G | H | K

получаем

( A | B | C  ) &  (D | E | F)  & (G | H | K)

...
ладно, забей, мож и я где-то запутался. %)

Ответить | Правка | ^ к родителю #18 | Наверх | Cообщить модератору

7. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от anonymous (??) on 29-Авг-11, 17:14 
> регвыру

Хватит, блин, аж глаза режет. Регэксп в крайнем случае.

Для перла и, наверное, пкре:
/(?<!abc|def|ghi)xyz/

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

10. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от xintrea email(ok) on 29-Авг-11, 17:26 
> Для перла и, наверное, пкре:
> /(?<!abc|def|ghi)xyz/

Да, для PCRE.

Выше написал - что делать в случае разной длинны "отрицательных" шаблонов?

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

13. "Регулярные выражения: совмещение шаблонов через И, ИЛИ, НЕ"  +/
Сообщение от anonymous (??) on 29-Авг-11, 23:51 
Ответ, как всегда, в /dev/random:
$ dd if=/dev/random bs=64 count=1
grep{$a=$_;!grep{$_}map{$a=~/(?<=$_)xyz/}qw/a bc def/}<>;#wtf??
$ _
Там много интересного, почитай ;)
Ответить | Правка | ^ к родителю #10 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру