powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Вроде бы простая задачка на регэксп, но...
11 сообщений из 11, страница 1 из 1
Вроде бы простая задачка на регэксп, но...
    #37277691
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но. Задачка пришла от одного знакомого студента. Формулировка очень простая: отфильтровать множество строк произвольного содержимого, удалив строки, оканчивающиеся на определенную последовательность. Содержимое этой последовательности - тоже произвольное (разумеется, в пределах всего множества строк эта последовательность одинакова). Платформа решения - любая (хотя изначально было предложено решать эту задачу на C#) - т.е. нет никаких ограничений на поддержку разных фич той или иной реализации парсера регулярных выражений. Можно использовать positive/negative looaheads/lookbehinds, named backreferences, possessive quantifiers - что угодно.
Вроде бы всё просто. Но вот тут и начинаются эти самые "но". Фильтрацию надо организовать без всякого привлечения процедурной логики - только одним регэкспом. Т.е. фильтр строк можно рассматривать как черный ящик: на вход подается исходное множество строк и регэксп, на выходе принимаем отфильтрованные строки - а это значит, что нельзя использовать повторную обработку еще какими-то регэкспами, нельзя даже использовать что-то типа !IsMatch. Как в конкурсных задачках на написание sql-запросов - там - голый sql, и ничего больше, тут - только регэксп, и ничего больше. Далее, выше говорилось про то, что надо отфильтровывать строки, оканчивающиеся на строго определенную последовательность. Допустим, эта последовательность - abc. Это означает, что фильтр должны проходить строки, заканчивающиеся на bac, на ab, строки длиной меньше 3 символов, строки, в которых последовательности abc нет вообще. Казалось бы, задача решается регэкспом (.*?)[^abc]$ - нет, не решается, строки с окончанием типа bac (например) тоже будут отфильтровываться. Пробовал использовать negative lookahead - он тут вообще никаким боком. В общем, я решение пока так и не нашел.

P.S. Да, хочу сразу оговорить такой пункт: данная задача в изложенной постановке для меня лично представляет чисто спортивный и академический интерес, и никакого практического, т.к. с привлечением процедурной логики она легко решаема школьником.
...
Рейтинг: 0 / 0
Вроде бы простая задачка на регэксп, но...
    #37277698
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, совсем забыл: в качестве решения задачи принимается обоснованное доказательство невозможности решения задачи в указанной постановке. Только пока и с этим туго. Единственное, что упорно приходит в голову - высказывание Jamie Zawinski по поводу подобной ситуации: «Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems.» :)
...
Рейтинг: 0 / 0
Вроде бы простая задачка на регэксп, но...
    #37278026
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

а что есть "множество строк"? Если это массив или список, то без цикла никак, регексы в принципе работают только с одной строкой (разве что цикл заменить рекурсией, но это то же самое).
...
Рейтинг: 0 / 0
Вроде бы простая задачка на регэксп, но...
    #37278163
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Сон Веры Павловны Пробовал использовать negative lookahead - он тут вообще никаким бокомЭто почему?
Код: plaintext
(?<!abc)$
...
Рейтинг: 0 / 0
Вроде бы простая задачка на регэксп, но...
    #37278340
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
Ой, это же lookbehind, а не lookahead - который действительно тут вообще никаким боком.
...
Рейтинг: 0 / 0
Вроде бы простая задачка на регэксп, но...
    #37279001
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Кривая постановка задачи. Слов много, смысла мало.
"отфильтровать множество строк произвольного содержимого, удалив строки, оканчивающиеся на определенную последовательность"
Платформа любая?

Код: plaintext
grep -v -e"abc$" file_to_filter

Нужна обязательно программа? Ну вот тебе awk:
Код: plaintext
1.
! /abc$/ {print}
...
Рейтинг: 0 / 0
Вроде бы простая задачка на регэксп, но...
    #37279675
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный МечЕсли это массив или список, то без цикла никак, регексы в принципе работают только с одной строкой (разве что цикл заменить рекурсией, но это то же самое).
Я в курсе, как работают регэкспы. Да, это массив/список, фильтр сам внутри себя организует перебор. Если нужен пример, чтобы было понятнее - откройте в файрфоксе страницу about:blank - там строка фильтра вверху вполне принимает регэкспы, и позволяет фильтровать по ним множество имеющихся настроек. Поисковое выражение в случае регэкспа надо просто заключить в //.

White OwlКривая постановка задачи. Слов много, смысла мало.
Что именно вам непонятно?
White OwlПлатформа любая?
См. стартовый постинг. Задача носит теоретический характер.
White OwlНужна обязательно программа?
Никакая программа не нужна, у меня их и так вполне хватает. Нужен регэксп.
White Owl
Код: plaintext
grep -v -e"abc$" file_to_filter

Ну вот тебе awk:
Код: plaintext
1.
! /abc$/ {print}

И еще раз см. стартовый постинг. На выходе не нужны строки, заканчивающиеся на abc - на выходе нужны все строки, кроме тех, которые заканчиваются на abc.
...
Рейтинг: 0 / 0
Вроде бы простая задачка на регэксп, но...
    #37279677
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловныоткройте в файрфоксе страницу about:blank
about:config, пардон.
...
Рейтинг: 0 / 0
Вроде бы простая задачка на регэксп, но...
    #37279695
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныЧто именно вам непонятно?Не понятны ограничения.

Сон Веры ПавловныWhite OwlПлатформа любая?
См. стартовый постинг. Задача носит теоретический характер.Это значит что платформа любая.

Сон Веры ПавловныИ еще раз см. стартовый постинг. На выходе не нужны строки, заканчивающиеся на abc - на выходе нужны все строки, кроме тех, которые заканчиваются на abc.Мои примеры именно это и делают. Принимают на вход файл со строками и показывают те строки которые не заканчиваются на abc.
Если они тебе не нравятся, уточняй постановку задачи. В первую очередь скажи свою платформу и приведи пример набора строк с которым работаешь. На первый постинг ссылаться не надо, там много воды не относящейся к делу.


И вообще, если хочешь работать с регулярными выражениями, то надо в первую очередь почитать учебники по конечным автоматам. Начни отсюда например: http://en.wikipedia.org/wiki/Deterministic_finite-state_machine
Для практического применения учи языки и системы основанные на регулярках - grep, awk, perl. После этого уже сможешь и в C# мазохиствовать.
...
Рейтинг: 0 / 0
Вроде бы простая задачка на регэксп, но...
    #37279802
ladayaroslav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны,

Как насчёт такого?

^(?!.*abc$)
...
Рейтинг: 0 / 0
Вроде бы простая задачка на регэксп, но...
    #37281710
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
new List<string> { "123abc", "456def", ",1q_0", "abc", "@#$bac",
    "abcabcab", "ab", "!", "" ,"abc abc" }
        .ForEach(s => Console.WriteLine("{0}\t{1}", s, Regex.IsMatch(s, @"^(?!.*abc$)")));
отрабатывает именно так, как требуется:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
123abc  False
456def  True
,1q_0   True
abc     False
@#$bac  True
abcabcab        True
ab      True
!       True
        True
abc abc False

Как говорится, тему можно закрывать.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Вроде бы простая задачка на регэксп, но...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]