Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Поиск группы символов в любом порядке без повторов

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
newcomer
Отправлено: 01 Сентября, 2014 - 21:39:19
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Май 2012  


Помог: 0 раз(а)




Никак не могу сообразить. Требуется регулярное выражение которое бы находило группу искомых символов в любом порядке в строке любой длины, как это делает выражение /[xyz]{3}/. Проблема в том, что символы не должны повторяться: т.е. может быть так .*(xyz).* или .*(yzx).* или .*(yxz).* . Сама длина группы искомых символов также может варьировать.
 
 Top
dcc0
Отправлено: 02 Сентября, 2014 - 12:09:51
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




У вас перестановки. Ради интереса перечитал руководство по preg_match, не нашел встроенного модификатора. Можно считать факториал числа элементов, например из массива и передавать в переменную, только код будет слишком большим.
Интересно, можно ли это сделать с помощью awk из консоли.

(Отредактировано автором: 02 Сентября, 2014 - 15:21:40)



-----
Март 2021. Бросил программирование
 
 Top
Мелкий Супермодератор
Отправлено: 02 Сентября, 2014 - 12:40:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Ух, это сильное колдунство.

Мой вариант:
PHP:
скопировать код в буфер обмена
  1. $rgAllowedSymbols = array('x','y','z');
  2.  
  3. $sRegexp = '';
  4. $sSymbolmask = '['.preg_quote(join('', $rgAllowedSymbols),'~').']';
  5. for ($iSymbol = 1; $iSymbol < count($rgAllowedSymbols); ++$iSymbol) {
  6.         $sRegexp .= '('.$sSymbolmask . ')' . "(?!".join('|',array_map(function ($el) {
  7.                 return '\\'.$el;
  8.                 }, range(1, $iSymbol))).")";
  9.         }
  10. $sRegexp .= $sSymbolmask;
  11.  
  12.  
  13. var_dump(preg_match_all('~'.$sRegexp.'~', 'foo xyx xyz xxx xyy zyx yxz ff', $rgOut), $rgOut[0]);

Мои ассерты проходит, но по соображениям сопровождаемости делать лучше двупроходным алгоритмом - сперва выбрать [xyz]{3}, потом отфильтровать, например, по count(array_unique(preg_split('~.~', $sMatch))), не равному количеству букв в наборе.


-----
PostgreSQL DBA
 
 Top
dcc0
Отправлено: 02 Сентября, 2014 - 14:06:48
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Моя мысль была примерно такой. Но на n символов понадобится n циклов и n + неизвестно сколько проверок. Недовольство, огорчение


Спойлер (Отобразить)

(Добавление)
Прав Мелкий, надо сначала получить все размещения, а это есть в preg_match, а потом из них все перестановки.

(Отредактировано автором: 02 Сентября, 2014 - 15:30:12)



-----
Март 2021. Бросил программирование
 
 Top
newcomer
Отправлено: 03 Сентября, 2014 - 06:17:57
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Май 2012  


Помог: 0 раз(а)




Мелкий, спасибо - то, что нужно.
Сам как раз к этому начал подходить, но за основу брал другую регулярку:
CODE (htmlphp):
скопировать код в буфер обмена
  1. "/(?:x()|y()|z()){3}\1\2\3/"
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB