我试图grep一个单词列表,并匹配那些具有完全一些字母的单词,无论顺序如何,但确实如此重要,例如,给出这些字母:
{ a, a, r, f, y, h, l }
列表
hello
far
hala
miss
cam
应该返回
far
hala
我不知道是否可以使用正则表达式或者必须编写某些内容,我们欢迎任何方法。
答案 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
答案 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?$/'