正则表达式匹配仅包含给定字符的单词

问题描述 投票:0回答:1

我想匹配仅包含一组给定字符的整个单词(或字符串)。

例如,如果给出的字母列表是 (p, o, p, s), 它应该像这样匹配/不匹配:

pop = match
sop = match
ps = match
poop = not match (because the list provided ONLY has 1 "o")

我尝试了正则表达式 [pops]+,但它返回所有匹配项

regex notepad++
1个回答
0
投票

正如 derpirscher 提到的,可能没有相当简单的正则表达式。但这是一个可能有用的解决方案,但它确实需要一些组装:

^(?!.*([os])(?:.*\1){1})(?!.*([p])(?:.*\2){2})[pos]+$

您可以检查测试用例这里

故障

限制字符串的可用字符

^(?!.*([os])(?:.*\1){1})(?!.*([p])(?:.*\2){2})[pos]+$
                                              ^^^^^^

[pos]+
表示整个字符串只能由字符
p
o
s
组成。仅供参考,
[pops]
相当于
[pos]
,因为字符集会忽略重复项。

限制出现

使用负向前瞻来限制特定字符可以出现的次数。

  1. o
    s
    最多只能出现一次
^(?!.*([os])(?:.*\1){1})(?!.*([p])(?:.*\2){2})[pos]+$
        ^^.          ^

(?!.*([os])(?:.*\1){1})
可以简化为
(?!.*([os]).*\1)
,但为了格式一致性,我保留了量词。

  1. p
    最多只能出现两次
^(?!.*([os])(?:.*\1){1})(?!.*([p])(?:.*\2){2})[pos]+$
                               ^           ^

使用相同的公式,对于字符集

abccddd
,正则表达式将是

^(?!.*([ab])(?:.*\1){1})(?!.*([c])(?:.*\2){2})(?!.*([d])(?:.*\3){3})[abcd]+$
© www.soinside.com 2019 - 2024. All rights reserved.