LINUX.ORG.RU

Поиск перестановок Perl

 ,


0

1

Как перловым регэкспом найти слово по имеющимся буквам? Например есть буквы «нторак» и сответственно ищется слово «картон». что-то на подобии такого:

 ^[нторак]{6}$
картон найдет, но найдет еще и вагон всякого ненужного. Есть мысль, что надо опиратся на уже найденное (\1..9) но как, понять не могу.

найдет еще и вагон всякого ненужного

Пример ненужного или пример исходных данных будет? Ибо задачу

найти слово по имеющимся буквам

вроде должно выполнять, если у тебя по слову в строке.

ziemin ★★
()
Ответ на: комментарий от ziemin

Пример: набор букв «будет» по приведенному примеру найдет и «будет» и «будут». Тоесть надо слова сотоящие только из заданных букв.

Confucij
() автор топика
Ответ на: комментарий от Confucij

Если без регэкспов, то искать в шаблоне очередную букву из слова, и выкусывать ее из шаблона.

Если регэкспы обязательны, то наверное даже если и есть способ, он будет так же алгоритмически сложен. К тому же шаблоны типа «как» (две и более одинаковые буквы) сильно все усложняют. Смысл?

anonymous
()
Ответ на: комментарий от Confucij

А еще можно отсортировать буквы как в слове, так и в шаблоне, и просто сравнить полученные строки.

anonymous
()

Не думаю, что использование регулярных выражений в данном случае хорошая идея. Тем не менее, мой вариант:
^(?:k()|a()|r()|t()|o()|n()){6}\1\2\3\4\5\6$

anonymous
()
Ответ на: комментарий от Confucij

(

Пример: набор букв «будет» по приведенному примеру найдет и «будет» и «будут». Тоесть надо слова сотоящие только из заданных букв.

&&

но найдет еще и вагон всякого ненужного

)
-> false

helios ★★★★★
()

Если без регекспов, можно использовать Algorithm::Permute (см. CALLBACK STYLE INTERFACE).

gv
()
Ответ на: комментарий от anonymous

^(?:k()|a()|r()|t()|o()|n()){6}\1\2\3\4\5\6$

Здорово! Долго вникал, как это работает, а оказалось все просто. Не посоветуете литературы по поводу перловых регулярных выражений? (кроме camel book и perlre). С перечислением вещей вроде того, что \1 не применится, если не было захвата.

gv
()
Ответ на: комментарий от anonymous

Как-то сразу я об этом не подумал. Так наверное и сделаю.

Confucij
() автор топика
Ответ на: комментарий от Confucij

Confucij

Жаль только, что я не понимаю ка кэто работает)

Ищем ровно 6 любых символов из набора:

(?:k()|a()|r()|t()|o()|n()){6}

Затем проверяем, что каждый символ из набора присутствует среди 6 найденных символов:

\1\2\3\4\5\6

Например \1 — это пустая строка, но она сматчится только если до этого был сматчен 'k'.

gv
()
Ответ на: комментарий от anonymous

^(?:k()|a()|r()|t()|o()|n()){6}\1\2\3\4\5\6$

Нахуй, нахуй.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.