我想匹配仅包含一组给定字符的整个单词(或字符串)。
例如,如果给出的字母列表是 (p, o, p, s), 它应该像这样匹配/不匹配:
pop = match
sop = match
ps = match
poop = not match (because the list provided ONLY has 1 "o")
我尝试了正则表达式 [pops]+,但它返回所有匹配项
正如 derpirscher 提到的,可能没有相当简单的正则表达式。但这是一个可能有用的解决方案,但它确实需要一些组装:
^(?!.*([os])(?:.*\1){1})(?!.*([p])(?:.*\2){2})[pos]+$
您可以检查测试用例这里
^(?!.*([os])(?:.*\1){1})(?!.*([p])(?:.*\2){2})[pos]+$
^^^^^^
[pos]+
表示整个字符串只能由字符p
、o
和s
组成。仅供参考,[pops]
相当于 [pos]
,因为字符集会忽略重复项。
使用负向前瞻来限制特定字符可以出现的次数。
o
和 s
最多只能出现一次^(?!.*([os])(?:.*\1){1})(?!.*([p])(?:.*\2){2})[pos]+$
^^. ^
可以简化为(?!.*([os])(?:.*\1){1})
,但为了格式一致性,我保留了量词。(?!.*([os]).*\1)
p
最多只能出现两次^(?!.*([os])(?:.*\1){1})(?!.*([p])(?:.*\2){2})[pos]+$
^ ^
使用相同的公式,对于字符集
abccddd
,正则表达式将是
^(?!.*([ab])(?:.*\1){1})(?!.*([c])(?:.*\2){2})(?!.*([d])(?:.*\3){3})[abcd]+$