Арт С.
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)$


Сделал так, но перестало играть видео в мозиле... в ИЕ и опере все работает... Как лечить?
Тут М.
626 сообщений
#15 лет назад
Hungry_Hunter
Может это поможет:
Артем Л.
11416 сообщений
#15 лет назад
Нет, там тоже самое что у меня в посте
Вообще это по идее не должно зависеть от браузера...
Роман В.
99 сообщений
#15 лет назад
Цитата ("Hungry_Hunter"):
Нет, там тоже самое что у меня в посте
Вообще это по идее не должно зависеть от браузера...

Это именно "штуки" самого ФФ вместе с флешплеером(и при запросе яваскриптом) - не посылать реферрера.
Webzavod W.
5 сообщений
#15 лет назад
Цитата ("tvv"):
не 2, а 3 однобуквенных: , , => 17 слов и 3 предлога?

- это два подрядыдущих непробела. (\S - непробел в рамках стандарта .NET)

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

задача остаётся в силе на сегодня.
Webzavod W.
5 сообщений
#15 лет назад
Цитата ("r0b1n"):
Как бэ.. тут больше строк получается, подходящих под шаблон (попробовал не на регекспах)


надо выбрать первый подходящий под шаблон вариант (как регвыры и делают).
Вадим Т.
3240 сообщений
#15 лет назад
Цитата ("webzavod"):
товарищи составители регвыражений!
есть ведь в регвыражениях ещё и количество повторений, циклы, переменные и ещё много чего другого странно, что вы их не используете.

Оно-то есть, только используется совсем для другого. Для данной задачи неприменимо.
IMHO единственный способ вместиться в один регексп в данной задаче - перебор всех вариантов, при этом размер регекспа будет около 20 килобайт, хотя он и будет очень простым по сути (как сказано в первом посте, "тупым перебором вариантов словосочетаний через OR".
Webzavod W.
5 сообщений
#15 лет назад
Слово{x} предлог слово{y} предлог слово {20-x-y}

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