|
|
|
Вроде бы простая задачка на регэксп, но...
|
|||
|---|---|---|---|
|
#18+
Но. Задачка пришла от одного знакомого студента. Формулировка очень простая: отфильтровать множество строк произвольного содержимого, удалив строки, оканчивающиеся на определенную последовательность. Содержимое этой последовательности - тоже произвольное (разумеется, в пределах всего множества строк эта последовательность одинакова). Платформа решения - любая (хотя изначально было предложено решать эту задачу на C#) - т.е. нет никаких ограничений на поддержку разных фич той или иной реализации парсера регулярных выражений. Можно использовать positive/negative looaheads/lookbehinds, named backreferences, possessive quantifiers - что угодно. Вроде бы всё просто. Но вот тут и начинаются эти самые "но". Фильтрацию надо организовать без всякого привлечения процедурной логики - только одним регэкспом. Т.е. фильтр строк можно рассматривать как черный ящик: на вход подается исходное множество строк и регэксп, на выходе принимаем отфильтрованные строки - а это значит, что нельзя использовать повторную обработку еще какими-то регэкспами, нельзя даже использовать что-то типа !IsMatch. Как в конкурсных задачках на написание sql-запросов - там - голый sql, и ничего больше, тут - только регэксп, и ничего больше. Далее, выше говорилось про то, что надо отфильтровывать строки, оканчивающиеся на строго определенную последовательность. Допустим, эта последовательность - abc. Это означает, что фильтр должны проходить строки, заканчивающиеся на bac, на ab, строки длиной меньше 3 символов, строки, в которых последовательности abc нет вообще. Казалось бы, задача решается регэкспом (.*?)[^abc]$ - нет, не решается, строки с окончанием типа bac (например) тоже будут отфильтровываться. Пробовал использовать negative lookahead - он тут вообще никаким боком. В общем, я решение пока так и не нашел. P.S. Да, хочу сразу оговорить такой пункт: данная задача в изложенной постановке для меня лично представляет чисто спортивный и академический интерес, и никакого практического, т.к. с привлечением процедурной логики она легко решаема школьником. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2011, 03:43 |
|
||
|
Вроде бы простая задачка на регэксп, но...
|
|||
|---|---|---|---|
|
#18+
Да, совсем забыл: в качестве решения задачи принимается обоснованное доказательство невозможности решения задачи в указанной постановке. Только пока и с этим туго. Единственное, что упорно приходит в голову - высказывание Jamie Zawinski по поводу подобной ситуации: «Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.» :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2011, 04:54 |
|
||
|
Вроде бы простая задачка на регэксп, но...
|
|||
|---|---|---|---|
|
#18+
Сон Веры Павловны, а что есть "множество строк"? Если это массив или список, то без цикла никак, регексы в принципе работают только с одной строкой (разве что цикл заменить рекурсией, но это то же самое). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2011, 11:00 |
|
||
|
Вроде бы простая задачка на регэксп, но...
|
|||
|---|---|---|---|
|
#18+
Сон Веры Павловны Пробовал использовать negative lookahead - он тут вообще никаким бокомЭто почему? Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2011, 11:55 |
|
||
|
Вроде бы простая задачка на регэксп, но...
|
|||
|---|---|---|---|
|
#18+
Ой, это же lookbehind, а не lookahead - который действительно тут вообще никаким боком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2011, 12:58 |
|
||
|
Вроде бы простая задачка на регэксп, но...
|
|||
|---|---|---|---|
|
#18+
Сон Веры Павловны, Кривая постановка задачи. Слов много, смысла мало. "отфильтровать множество строк произвольного содержимого, удалив строки, оканчивающиеся на определенную последовательность" Платформа любая? Код: plaintext Нужна обязательно программа? Ну вот тебе awk: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2011, 17:38 |
|
||
|
Вроде бы простая задачка на регэксп, но...
|
|||
|---|---|---|---|
|
#18+
Яростный МечЕсли это массив или список, то без цикла никак, регексы в принципе работают только с одной строкой (разве что цикл заменить рекурсией, но это то же самое). Я в курсе, как работают регэкспы. Да, это массив/список, фильтр сам внутри себя организует перебор. Если нужен пример, чтобы было понятнее - откройте в файрфоксе страницу about:blank - там строка фильтра вверху вполне принимает регэкспы, и позволяет фильтровать по ним множество имеющихся настроек. Поисковое выражение в случае регэкспа надо просто заключить в //. White OwlКривая постановка задачи. Слов много, смысла мало. Что именно вам непонятно? White OwlПлатформа любая? См. стартовый постинг. Задача носит теоретический характер. White OwlНужна обязательно программа? Никакая программа не нужна, у меня их и так вполне хватает. Нужен регэксп. White Owl Код: plaintext Ну вот тебе awk: Код: plaintext 1. И еще раз см. стартовый постинг. На выходе не нужны строки, заканчивающиеся на abc - на выходе нужны все строки, кроме тех, которые заканчиваются на abc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2011, 06:21 |
|
||
|
Вроде бы простая задачка на регэксп, но...
|
|||
|---|---|---|---|
|
#18+
Сон Веры Павловныоткройте в файрфоксе страницу about:blank about:config, пардон. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2011, 06:22 |
|
||
|
Вроде бы простая задачка на регэксп, но...
|
|||
|---|---|---|---|
|
#18+
Сон Веры ПавловныЧто именно вам непонятно?Не понятны ограничения. Сон Веры ПавловныWhite OwlПлатформа любая? См. стартовый постинг. Задача носит теоретический характер.Это значит что платформа любая. Сон Веры ПавловныИ еще раз см. стартовый постинг. На выходе не нужны строки, заканчивающиеся на abc - на выходе нужны все строки, кроме тех, которые заканчиваются на abc.Мои примеры именно это и делают. Принимают на вход файл со строками и показывают те строки которые не заканчиваются на abc. Если они тебе не нравятся, уточняй постановку задачи. В первую очередь скажи свою платформу и приведи пример набора строк с которым работаешь. На первый постинг ссылаться не надо, там много воды не относящейся к делу. И вообще, если хочешь работать с регулярными выражениями, то надо в первую очередь почитать учебники по конечным автоматам. Начни отсюда например: http://en.wikipedia.org/wiki/Deterministic_finite-state_machine Для практического применения учи языки и системы основанные на регулярках - grep, awk, perl. После этого уже сможешь и в C# мазохиствовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2011, 07:28 |
|
||
|
Вроде бы простая задачка на регэксп, но...
|
|||
|---|---|---|---|
|
#18+
Сон Веры Павловны, Как насчёт такого? ^(?!.*abc$) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2011, 09:22 |
|
||
|
Вроде бы простая задачка на регэксп, но...
|
|||
|---|---|---|---|
|
#18+
White OwlНе понятны ограничения. И ещё раз читаем стартовый постинг. Там написано про теоретический характер задачи. White OwlМои примеры именно это и делают. Принимают на вход файл со строками и показывают те строки которые не заканчиваются на abc. Отбрасывание строк с указанным окончанием делается не за счет того, что регэксп их не сматчил. Он делается внутренней логикой обертки над парсером регэкспов - того же awk. В стартовом постинге написано, что такое решение не рассматривается. White OwlИ вообще, если хочешь работать с регулярными выражениями, то надо в первую очередь почитать учебники по конечным автоматам. Начни отсюда например: http://en.wikipedia.org/wiki/Deterministic_finite-state_machine Для практического применения учи языки и системы основанные на регулярках - grep, awk, perl. Спасибо за многомудрое наставление, Учитель :). Я знаю, что такое конечный автомат. И учебники по ним я читал. ladayaroslavКак насчёт такого? ^(?!.*abc$) Да, спасибо, вот это именно то, что и было нужно: Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Как говорится, тему можно закрывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2011, 06:37 |
|
||
|
|

start [/forum/topic.php?fid=16&fpage=84&tid=1342925]: |
0ms |
get settings: |
10ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
15ms |
get forum data: |
4ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 237ms |
| total: | 418ms |

| 0 / 0 |
