如何创建仅匹配给定单词中指定字母及次数的正则表达式?
解决方案
要满足你提出的所有匹配条件,我们可以通过正向预查+负向预查组合的方式构造正则表达式,核心是验证测试字符串中每个字母的出现次数恰好等于正则中的对应次数,同时忽略字母顺序和额外字符。
核心思路
针对目标模式(比如ppy),我们需要对每个字母做两层验证:
- 正向预查:确保测试字符串中该字母的出现次数至少等于模式中的次数;
- 负向预查:确保测试字符串中该字母的出现次数至多等于模式中的次数;
两者结合即可保证次数完全匹配,同时预查不限制字母顺序,允许被其他字符分隔。
具体步骤
- 统计模式字符频次:先统计目标模式中每个字母的重复次数,比如
ooyc的频次为:o:2、y:1、c:1。 - 构造预查规则:
- 对频次为
n的字母c,正向预查写为:(?=(.*c){n}) - 对应的负向预查写为:
(?!(.*c){n+1})
- 对频次为
- 组合正则表达式:将所有预查规则拼接,首尾加上
^和$,最后用.*匹配任意额外字符。
示例验证
以测试字符串polymmorphiiic为例:
可匹配的模式及对应正则
模式
ppy:^(?=(.*p){2})(?!(.*p){3})(?=(.*y){1})(?!(.*y){2}).*$验证:测试字符串中
p恰好2次、y恰好1次,满足条件,匹配成功。模式
ooyc:^(?=(.*o){2})(?!(.*o){3})(?=(.*y){1})(?!(.*y){2})(?=(.*c){1})(?!(.*c){2}).*$验证:测试字符串中
o恰好2次、y恰好1次、c恰好1次,满足条件,匹配成功。模式
iiii:^(?=(.*i){4})(?!(.*i){5}).*$验证:测试字符串中
i恰好4次,满足条件,匹配成功。
无法匹配的模式原因
- 模式
pmy:对应的正则会包含(?!(.*p){2}),但测试字符串中p有2次,触发负向预查失败,无法匹配。 - 模式
iy:对应的正则会包含(?!(.*i){2}),但测试字符串中i有4次,触发负向预查失败,无法匹配。 - 模式
yrz:对应的正则会包含(?=.*z),但测试字符串中无z,触发正向预查失败,无法匹配。
通用模板
对于任意目标模式,只需按上述步骤替换字母和频次即可生成对应的正则表达式,完全满足你提出的所有匹配条件。
内容的提问来源于stack exchange,提问作者User0612
相关产品推荐
相关产品推荐

