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

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

🟡 21:35 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
Статус: Offline
Реєстрація: 30.04.2007
Повідом.: 895
  • 🟡 21:35 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #1
Регулярные выражения VB

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

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

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

если повторения одного слова не допускаются, тогда, наверное, нужно будет использовать бэктрекинг (backtracking). В .NET-овских регулярных выражениях он есть, насчет VBScript'овых не уверен
 
  • 🟡 21:35 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #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:35 Відбій тривоги в Харківський район.Зверніть увагу, тривога ще триває у:- Харківський район#Харківський_район
  • #7
Ну вообще-то мне нужно на VB. PHP для меня темный лес.
Получилось найти пробелы между словами, в каком бы порядке и в каком бы количестве они не шли
(?<=(мама|папа|сын))\s(?=(?:(мама|папа|сын))+(?!(мама|папа|сын)))

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

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

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