Знатокам регулярных выражений
13 сообщений
#15 лет назад
Тут проскакивал проект по созданию хитрого регулярного выражения - ссылкаЗадача "простая": выделить из текста первое вхождение из 20 слов, из которых два слова - однобуквенные. Положение однобуквенных слов произвольно.
Мне вот интересно, возможно ли одним PCRE сделать такое красиво (не тупым перебором вариантов словосочетаний через OR) и эффективно (по времени отработки)?
Самое очевидное - двумя выражениями выделить 20 слов, а потом еще и проверить на наличие двух однобуквенных не проходит - уже после первого выражения выборка будет неверной, поскольку разобьет текст на равные куски (а не по критерию).
Интерес чисто академический, продавать результат не собираюсь.
99 сообщений
#15 лет назад
Как бэ.. тут больше строк получается, подходящих под шаблон (попробовал не на регекспах) 
- здесь текст предложения, содержащего предлоги в один символ напр. букву в или букву и, причём тут более 20ти слов всяких
текст предложения, содержащего предлоги в один символ напр. букву в или букву и, причём тут более 20ти слов всяких разных.
предложения, содержащего предлоги в один символ напр. букву в или букву и, причём тут более 20ти слов всяких разных. вот
один символ напр. букву в или букву и, причём тут более 20ти слов всяких разных. вот и надо выбрать этот
символ напр. букву в или букву и, причём тут более 20ти слов всяких разных. вот и надо выбрать этот текст
А регулярку "красивую" и удобоваримую составить вряд ли получится, ИМХО.
13 сообщений
#15 лет назад
Цитата ("r0b1n"):А регулярку "красивую" и удобоваримую составить вряд ли получится, ИМХО.
Ну вот мне и интересно, возможно ли это в принципе

3240 сообщений
#15 лет назад
Вижу лишь один способ, это составить огромный регексп, который будет включать в себя все 20x(20-1) = 380 вариантов, объединенных по условию ИЛИ (тупо перебор, как и говорится в первом посте).Этот способ будет работать, хотя он и будет ужасен.
Но другого способа вместиться в один регексп не вижу.
3240 сообщений
#15 лет назад
Примечание: в моем предложении выше повторение предлогов не учитывается, а например в примере заказчика проекта:"один символ напр. букву в или букву и, причём тут более 20ти слов всяких разных. вот и надо выбрать этот"
не 2, а 3 однобуквенных: , , => 17 слов и 3 предлога?
Если такое повторение по условию задачи возможно, то в один регексп вложиться станет нереально (точнее теоретически реально, но тогда размер регекспа увеличится настолько, что ни один парсер регекспов его не возьмет).
IMHO зря мы ломаем голову, скорее всего задание составлено неправильно, или приведенный заказчиком пример не верен.
3240 сообщений
#15 лет назад
И еще, заказчику нужно: "регвыр требуется составить по стандартам .NET FrameWork - msdn.microsoft.com/ru-ru/library/hs600312.aspx здесь описан."Это не PCRE, хотя и совместимо по довольно большому ряду фич.
13 сообщений
#15 лет назад
Цитата ("tvv"):И еще, заказчику нужно
Да, но я уже писал что мой вопрос не имеет никакого отношения к выполнению его задачи. Тут меня интересует только собственный уровень владения PCRE

11416 сообщений
#15 лет назад
Я тоже вопрос по регуляркам задам...Надо сделать защиту от прямых ссылок, что бы с других сайтов не могли забирать видео...
RewriteCond %{HTTP_REFERER} !^ссылка
RewriteRule \.(jpg|jpeg|gif|png|bmp|flv)$ ссылка
Сделал так, но перестало играть видео в мозиле... в ИЕ и опере все работает... Как лечить?
11416 сообщений
#15 лет назад
Нет, там тоже самое что у меня в посте 
Вообще это по идее не должно зависеть от браузера...
99 сообщений
#15 лет назад
Цитата ("Hungry_Hunter"):Нет, там тоже самое что у меня в посте
Вообще это по идее не должно зависеть от браузера...
Это именно "штуки" самого ФФ вместе с флешплеером(и при запросе яваскриптом) - не посылать реферрера.
5 сообщений
#15 лет назад
Цитата ("tvv"):не 2, а 3 однобуквенных: , , => 17 слов и 3 предлога?
- это два подрядыдущих непробела. (\S - непробел в рамках стандарта .NET)
товарищи составители регвыражений!
есть ведь в регвыражениях ещё и количество повторений, циклы, переменные и ещё много чего другого

задача остаётся в силе на сегодня.
5 сообщений
#15 лет назад
Цитата ("r0b1n"):Как бэ.. тут больше строк получается, подходящих под шаблон (попробовал не на регекспах)
надо выбрать первый подходящий под шаблон вариант (как регвыры и делают).
3240 сообщений
#15 лет назад
Цитата ("webzavod"):товарищи составители регвыражений!
есть ведь в регвыражениях ещё и количество повторений, циклы, переменные и ещё много чего другогостранно, что вы их не используете.
Оно-то есть, только используется совсем для другого. Для данной задачи неприменимо.
IMHO единственный способ вместиться в один регексп в данной задаче - перебор всех вариантов, при этом размер регекспа будет около 20 килобайт, хотя он и будет очень простым по сути (как сказано в первом посте, "тупым перебором вариантов словосочетаний через OR"

5 сообщений
#15 лет назад
Слово{x} предлог слово{y} предлог слово {20-x-y} где x и y - переменные.
как-нибудь так нельзя?
3240 сообщений
#15 лет назад
Вообще, пожалуй, задача не безнадежна.Дело в том, что .NET Regexps, в отличие от большинства реализаций PCRE, поддерживает negative lookbehind (?<!) с переменным количеством проверяемых символов (если не путаю). С этим можно попробовать помудрить.