Змінюй хід війни! Допомагай ЗСУ!

Регулярные выражения VB

🔴 21:30 Повітряна тривога в Харків.обл.
Статус: Offline
Реєстрація: 30.04.2007
Повідом.: 895
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #1
Регулярные выражения VB

Задача отыскать строку состоящую из определенного набора слов в разной последовательности.
Например, имеется набор слов: мама, папа, сын. Нужно найти: «мама папа сын», «мама сын папа», «папа мама сын» и пр.
Таких слов много. Как найти одно из них я знаю, а вот как найти их комбинации?
Разделяться слова могут пробелами, табуляторами, или переводами строки.

И вообще интересует возможность решения этой задачи только с помощью RegExp.
Циклами я и сам сделаю.:)
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #2
Без перловых расширений регекспа или без генерации длинной регулярки под все комбинации (а это надо будет делать в цикле :) ) - ИМХО нельзя.
В ВБ скорее всего расширений нет :)

Ну или как вариант генерить строку типа:
my $str = '/папа/ && /мама/ && /сын/';
(все равно ведь будешь как-то работать со списком слов) и делать eval. Поищи аналогичное решение на ВБ.
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #3
Решение есть! Я уже на полдороги к нему. Perl здесь ни к чему, можно обойтись VBScript
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #4
Ага. Как пройдешь оставшуюся половину - ты нам напиши, аж интересно. Не забудь, что не должно быть циклов :)
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #5
Шо-нибудь типа
Код:
(мама|папа|сын)(\s|\t|\n)(мама|папа|сын)(\s|\t|\n)(мама|папа|сын)
?

если повторения одного слова не допускаются, тогда, наверное, нужно будет использовать бэктрекинг (backtracking). В .NET-овских регулярных выражениях он есть, насчет VBScript'овых не уверен
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #6
Шо-нибудь типа
Код:
(мама|папа|сын)(\s|\t|\n)(мама|папа|сын)(\s|\t|\n)(мама|папа|сын)
?
Шонить типа этого надо генерить в цикле. Кроме того ты забыл разделители между группировками (че-нить типа "точка-плюс" ) - слова же не вплотную друг к другу... И повторы опять же.
если повторения одного слова не допускаются, тогда, наверное, нужно будет использовать бэктрекинг (backtracking).
Хмм. Интересная мысль "использовать бэктрекинг". Примерно как "использовать вращение барабана стиральной машинки для стирки".
Бектрекинг нельзя "использовать", бектрекинг автоматически производится движком регекспов в случае использования в выражении например квантификаторов и заключается в возврате назад по строке для использования нового уровня "жадности" квантификаторов.
Проблема в избежании повторов. Я лично не вижу способа сказать в выражении "набор без вхождения \1" так, чтобы не использовать логические расширения типа (? == )

ААААА! Плять, таки это можно! :)
Пусть это не чисто регекспы - но зато нет ни одного цикла :)

Грм. Чет я не понял что за "неведомая хуйня" (с) не позволяет мне вставить код с собачками и меняет его на звездочки?
Вобщем в приведенном ниже примере все звездочки надо заменить на собачки (ибо собачка в перле - это массив)

Код:
*words = qw(mother father sunny);
$str = "mother 111 father 999 mother 222 father 333 sudnny 444 mother sunny";
$pattern = join("|", *words);
*p = split /($pattern)/, $str;
shift *p if ($p[0] !~ /^($pattern)$/);
%k = *p;
print "PRESENT" if (scalar *words == scalar keys (%k));
 
Останнє редагування:
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #7
Ну вообще-то мне нужно на VB. PHP для меня темный лес.
Получилось найти пробелы между словами, в каком бы порядке и в каком бы количестве они не шли
(?<=(мама|папа|сын))\s(?=(?:(мама|папа|сын))+(?!(мама|папа|сын)))

Но не могу сообразить как найти всю строку, которая содержит только эти слова в любом порядке и количестве
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #8
как как, в цикле :)
 
  • 🔴 21:30 Повітряна тривога в Харків.обл.
  • #9
Ну вообще-то мне нужно на VB. PHP для меня темный лес.
Пример вообще-то на Перле. :D
Получилось найти пробелы между словами, в каком бы порядке и в каком бы количестве они не шли
(?<=(мама|папа|сын))\s(?=(?:(мама|папа|сын))+(?!(мама|папа|сын)))
то все фигня, такое за 15 секунд напишет человек, который слегка понимает в регулярках. Причем в 10 раз проще, чем ты написал :)

Но не могу сообразить как найти всю строку, которая содержит только эти слова в любом порядке и количестве
Судя по твоим терзаниям - у тебя таки есть расширения регулярки. Если не хочешь смотреть мой пример, а хочешь пострадать - даю подсказку: внутри регулярки можно обратиться к результатам предыдущих захватов через переменные \1 \2 \3 \.... Анализируй результаты предыдущих захватов. Вот только генерить такую регулярку тебе придется явно в цикле :D

2Каприкорн: у меня сделано как раз без циклов ;)
 
Назад
Зверху Знизу