使用正则表达式匹配另一个单词的排列单词

时间:2014-06-12 12:00:46

标签: regex permutation matching words

我有一大堆单词,所有单词都是有效的英语单词,我将用RegExp查询。

我需要的是匹配包含任何顺序的指定单词的字母的单词。

示例(A段):

...
peloton
pelt
pelta
peltae
peltast
....

我应该可以填写“leap”的正则表达式并收集“pelta”,“peltae”和“peltast”以及数据库中的其他单词。 (如:“自我保护”)

我有什么:

/^([chars]).*(?:\1|([chars])).*(?:\1|\2|([chars])).*{et cetera}.*(?:\1|\2|{et cetera}|\{n-1}|([chars]))(?{n})$/

(填写 {et cetera} {n} {n-1} 以及相应的字长)

这就是它(应该如此)的作用:

你从单词中的一个字符池开始,希望没有任何重复的字符。 (这个组是[chars]。) 首先,它匹配它在[chars]中看到的第一个字符。 然后当它在[chars]中查找下一个字符时,它或者匹配第一个匹配,并且不捕获任何内容,或者匹配池中的任何其他字符,并捕获下一个字符。基本上,第二个(?:)组从字符池中删除第一个匹配。一旦它捕获了n个字符,它会检查第n个字符是否实际匹配。如果没有,那么它与单词不匹配。

但这次迭代并没有真正起作用。对此有何正确的尝试?

注意:我没有贪图,所以我确实需要使用^$。而不是\b

提前致谢!

编辑:我也尝试过这种做法。它根本不起作用。

/^(([chars]).*(?!\1|\2)){n}$/

1 个答案:

答案 0 :(得分:4)

使用lookaheads,以“leap”为例:

\b(?=[a-z]*l)(?=[a-z]*e)(?=[a-z]*a)(?=[a-z]*p)[a-z]+\b

小提琴:http://refiddle.com/12u4

编辑:我添加了\b个锚点(字边界);领先者特别重要,否则“上诉”可能被捕获三次(“上诉”,“ppeal”,“peal”)。请在适当的时候随意使用其他锚点(例如^...$)。

顺便说一下,这种方法也适合不止一次匹配同一个角色。假设您要匹配包含字母“pop”的所有单词(即至少两个“p”和至少一个“o”)。

\b(?=[a-z]*p[a-z]*p)(?=[a-z]*o)[a-z]+\b

或者使用量词:

\b(?=([a-z]*p){2})(?=[a-z]*o)[a-z]+\b

两者都匹配“pop”,“pope”,“oppress”,但不是“poke”。