我有一大堆单词,所有单词都是有效的英语单词,我将用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}$/
答案 0 :(得分:4)
使用lookaheads,以“leap”为例:
\b(?=[a-z]*l)(?=[a-z]*e)(?=[a-z]*a)(?=[a-z]*p)[a-z]+\b
编辑:我添加了\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”。