|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Sapozhnikov 2:5020/400 03 Aug 2000 12:57:31 To : All Subject : Re: Hаименее общий паттерн -------------------------------------------------------------------------------- vitus@ice.ru wrote: > > Dmitry Startsev <startsev@x4u.lebedev.ru> wrote: > DS>Вот скажем есть слово "мультиканальный". > DS>Ему можно сопоставить паттерны > DS>/мультик.*/ > DS>/му.*/ > DS>/м.*/ > DS>ну и массу всяких других. > DS>Как имея _неупорядоченный_ набор таких паттернов найти > > Упорядочить их. Посредством поматчить друг с другом. > Т.е . если /м.*/=~ "мультик.*" то м.* - меньше. Hе выйдет. /^[Мм]у/ и /к$/ никак не матчатся. А наименее общее можно найти так. 1. Переписать все паттерны чтобы они: а) Покрывали ВСЮ строку. б) Все "общие" соответствия обернуть скобками. (т.е. /му/ => /^(.*)му(.*)/ ) 2. Применить к слову все паттерны по-очереди. (т.е. my @cmn=$word=~/^(.*)му(.*)/; ) 3. посчитать длину "общих" соответствий. my $len=0; map { $len+=length} @cmn; 4. У кого длина меньше - тот более конкретный, у кого больше - общий. Андрей P.S. Можно и не покрывать всю строку. При этом my $len=length($word)-length($&); P.P.S. Переписать регексп автоматом довольно сложно. Оставляю в качестве домашнего задания :-) --- ifmail v.2.15dev5 * Origin: Chelindbank (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/52846dc25a61.html, оценка из 5, голосов 10
|