Знатокам регулярных выражений
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 (?<!) с переменным количеством проверяемых символов (если не путаю). С этим можно попробовать помудрить.