正则表达式(grep)匹配由这些字母组成的单词

时间:2014-07-08 20:36:16

标签: regex

我试图grep一个单词列表,并匹配那些具有完全一些字母的单词,无论顺序如何,但确实如此重要,例如,给出这些字母:

{ a, a, r, f, y, h, l }

列表

hello
far
hala
miss
cam

应该返回

far
hala

我不知道是否可以使用正则表达式或者必须编写某些内容,我们欢迎任何方法。

3 个答案:

答案 0 :(得分:1)

使用负向前瞻处理数量限制,每个字母对应一个数字限制,以及简单字符类结尾的单词边界

\b(?!([^a\W]*a){3})(?!([^r\W]*r){2})(?!([^f\W]*f){2})(?!([^y\W]*y){2})(?!([^h\W]*h){2})(?!([^l\W]*)l{2})[arfyhl]+\b

请参阅live demo,包括在较长行中匹配的字词。

\W的使用会阻止前方的结束。

答案 1 :(得分:0)

与波希米亚语相同,由于使用了反向引用而稍微缩短了一些:

\b(?!\w*([rfyhl])\w*\1|\w*([a])(?:\w*\2){2})[arfyhl]+\b

小提琴:http://regex101.com/r/gO6dC4/1

答案 2 :(得分:0)

按字母顺序对每个单词中的字符进行排序;然后你可以使用一个简单的正则表达式/^a?a?f?h?l?r?y?$/(确保正则表达式中的字母按字母顺序排列)。

此AWK脚本将过滤stdin上的单词(每行一个单词):

awk 'function sort(s,z){l=split(s,a,"");asort(a);while(l)z=a[l--]z;return z;}sort($0)~/^a?a?f?h?l?r?y?$/'