Найти комбинацию вхождеий Х слов в произвольной последовательности

Тема в разделе "Регулярные выражения", создана пользователем dandandan, 28 фев 2013.

Статус темы:
Закрыта.
Модераторы: xpert13
  1. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Есть Х слов. Например 4 шт:
    aaa bbb ccc ddd.

    Нужно регуляркой на php найти вхождение всех словосочитаний в тексте.
    Словосочитание собирается обязательно из всех слов во всех возможных вариантах
    aaa bbb ccc ddd
    bbb aaa ccc ddd и т.д.


    p.s.
    Для усложнения каждое слово может содержать несколько слов с записью через ИЛИ.
    aa|a bb|b cc|c dd|d

    В усложненном варианте:
    aa|a bb|b cc|c dd|d
    bb|b aa|a cc|c dd|d и т.д.

    p.s.s. Я уже год голову ломаю. Решил с вами поделиться.
     
  2. deling2

    deling2

    Регистр.:
    27 янв 2008
    Сообщения:
    326
    Симпатии:
    192
    Что-то задача явно записана не правильно. Лучше слова позначить просто как a, b, c, d.
    Это как, слово из слов? Лучше конкретные примеры напишите, иначе вы сами запутаетесь в условных значениях и других запутаете.
     
  3. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    простой вариант
    слово1 слово2 слово3 слово4
    сложный вариант
    (слово1a) |(слово1b)|(слово1c).... (слово2а)|(слово2b)

    Надо найти для всевозможных комбинации их вхождение в текст. Ниже написал несклько комбинаций:
    • слово1 слово2 слово3 слово4
    • слово2 слово1 слово3 слово4
    • слово3 слово2 слово1 слово4
    • слово4 слово2 слово3 слово1
    Если слов 4 шт, то надо найти 4! комбинаций, т.е 1*2*3*4=24 комбинации слов в тексте.
    Для сложного варианта из 4 слов тоже 24 комбинации но каждое слово - это выбор из нескольких слов.

    Приведу пример для поиска из 2 слов:
    веселый чувак
    Есть 2 варианта комбинации:
    • веселый чувак
    • чувак веселый
    Т.е. надо найти в предложении (выделил жирным:(
    Этот веселый чувак ушел .... и чувак веселый день ....

    В усложненном варианте

    (веселый)|(грустный)|(радостный) (чувак)|(парень)|(дед)|(мужик)|(мужчина)
    Есть 2 варианта комбинации:
    • (веселый)|(грустный)|(радостный) (чувак)|(парень)|(дед)|(мужик)|(мужчина)
    • (чувак)|(парень)|(дед)|(мужик)|(мужчина) (веселый)|(грустный)|(радостный)
    Т.е. надо найти в предложении (выделил жирным:(
    Этот веселый чувак ушел .... и чувак веселый день .... грустный мужчина брел домой, а дед веселый смеялся.

    Количество слов может быть разное и 5 и 10 шт. Хотелось бы это сделать одной регуляркой.
    Есть вариант с составлением всех возможных вариантов в цикле, но не нравится.
     
  4. xpert13

    xpert13 <(*_*)>

    Moderator
    Регистр.:
    7 ноя 2008
    Сообщения:
    182
    Симпатии:
    453
    1. Генерируешь всевозможные варианты порядка слов (можно взять алгоритмы размножения текстов и писать под них шаблоны, чтобы облегчить себе жизнь)
    2. Ищешь вхождение каждого из вариантов в тексте, выделяешь жирным при совпадении

    Альтернатива:
    1. Составляешь универсальную регулярку для поиска вхождения любого из варианто
    2. Используешь её

    По быстродействию думаю оба варианта одинаковы, так как по сути выполняют аналогичные действия
     
  5. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Собственно я для этого и задал вопрос. Как создать такую универсальную регулярку? Мне мозгов не хватает. Множить варианты это не проблема, но мне не интересно.
     
  6. xpert13

    xpert13 <(*_*)>

    Moderator
    Регистр.:
    7 ноя 2008
    Сообщения:
    182
    Симпатии:
    453
    Регулярка: (веселый чувак|чувак веселый)

    Регулярка: ((веселый|грустный|радостный) (чувак|парень|дед|мужик|мужчина)|(чувак|парень|дед|мужик|мужчина) (веселый|грустный|радостный))

    Думаю смысл понятен
     
  7. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Смысл понятен. Я про этот смысл писал уже 2 раза, что не хочу создавать такие длинные регулярки. Если бы была задача физически создать все возможные варианты в виде длинного текста, я бы написал в php ветку форума. :)

    Мне же интересен другой подход в регулярках (для самообразования и последующего внедрения). Например реализовать это через обратный поиск или еще как-то без создания огромной простыни текстов... Наверняка такое возможно.
     
  8. xpert13

    xpert13 <(*_*)>

    Moderator
    Регистр.:
    7 ноя 2008
    Сообщения:
    182
    Симпатии:
    453
    Какая задача - такое и решение. Я практически на 100% уверен, что короткую регулярку в данном случае не создать.
     
  9. h_hogan

    h_hogan Создатель

    Регистр.:
    8 мар 2013
    Сообщения:
    39
    Симпатии:
    2
    Для перебора всех вариантов регулярка будет такой
    Код:
    ~(?:word1\s*|word2\s*|word3\s*|word4\s*){4}~
    Где цифра в фигурных скобках количество слов, соответственно
     
    dandandan нравится это.
  10. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    975
    Симпатии:
    255
    Я правильно понимаю, что это будет работать при условии, что в тексте слова не повторяются?
     
Статус темы:
Закрыта.