2017-01-07 4 views
0

Я ищу способ написать алгоритм для решения салатов с письмами. Например, если у меня есть буквыRegEx для строк, содержащих определенные символы и имеющих определенную длину

ZDFOG

, а также знать, что слово, которое я ищу длиной 3 символа, слова которого соответствует, если я могу только использовать каждый символ один раз?

Предположим, у меня есть словарь с общепринятыми словами.

Так RegXx должна соответствовать

собака Собака туман туман бог Бог

Но не должны совпадать со строками, как будто они являются частью словаря, потому что каждое письмо следует содержать один раз:

ff о ду Ggg

Итак, есть элегантный способ искать все слова в словаре, который содержит определенные символы и имеет определенную длину?

+0

было бы хорошо, если бы вы разместили какое-то входное предложение, поисковое слово и ожидаемые совпадения – RomanPerekhrest

+0

Я обновил свой вопрос, спасибо – Kingalione

ответ

1

Это довольно непонятно.

Если ваш словарь является общепринятым, почему ffo doo Ggg должны быть представлены?

Я думаю, вам будет лучше использовать программу на C, чтобы получить то, что вы хотите. Regex не является языком алгоритма.

Во всяком случае, это то, что вы хотите:\b(([A-Za-z])((?!\2)[A-Za-z])((?!\2|\3)[A-Za-z]))\b

Он ловит только 3 различных буквы слов, как вы хотели.

Доказательство: https://regex101.com/r/wAbT99/3

Но вы должны знать, что этот метод может быть медленным.

+0

позволяет предположить, что эти слова находятся в словаре. – Kingalione

+0

Я отредактировал с ответом. –

+0

Может ли умный цикл быть быстрее, чем RegEx в этом случае? – Kingalione

0

Без учета повторяющихся букв, например egg, решение прост; использовать закрепленный взгляд вперед для каждой буквы:

^(?=.*F)(?=.*O)(?=.*G).* 

С дублями, это немного уродливее:

^(?=.*E)(?=.*G.*G).* 

Вы можете использовать общее решение:

^(?=(.*E){1})(?=(.*G){2}).* 

Когда число повторение {n} - количество вхождений буквы - это целевое слово.360

+0

Итак, мне нужно создать все комбинации, чтобы искать, потому что в начале есть больше букв, чем в решениях? Как и буква Z в моем примере. – Kingalione

+0

@king no. Порядок взгляда впереди не имеет значения. Вам нужно создать один взгляд вперед с правильным количеством для каждой отдельной буквы. Например, для поиска «EGG» регулярные выражения '^ (? = (. * G) {2}) (? =. * E). * И'^(? =. * E) (? = (. * G) {2}). * 'Оба правильны – Bohemian

+0

да, но давайте предположим, что в вашем примере яйца указаны буквы LTGEGU, а длина слова - 3 буквы. поэтому я должен создать все комбинации, которые могут быть сделаны с буквами LTGEGU и длиной 3, чтобы получить соответствие для всех слов в словаре или нет? – Kingalione

Смежные вопросы