Regex 如何仅使用正则表达式匹配A组字符数大于B组字符数的模式?
例如,我希望匹配如下模式:Regex 如何仅使用正则表达式匹配A组字符数大于B组字符数的模式?,regex,Regex,例如,我希望匹配如下模式: AAAB 阿贝布 AAB 与以下模式不匹配: 阿阿巴布 神甫 AABBB 如上示例所示,字符B的出现次数应少于字符A。请考虑在匹配后比较组长度,而不是直接在正则表达式中区分组长度 Python中的示例: 对于\u字符串集合中的测试\u字符串: match=re.match(re_myregex,test_字符串) 如果不匹配:#正则表达式根本不匹配 继续#跳到循环的顶部以尝试下一个字符串 a、 b=匹配.groups()#解包匹配组 如果len(b)>=len(a):
如上示例所示,字符B的出现次数应少于字符A。请考虑在匹配后比较组长度,而不是直接在正则表达式中区分组长度 Python中的示例:
对于\u字符串集合中的测试\u字符串:
match=re.match(re_myregex,test_字符串)
如果不匹配:#正则表达式根本不匹配
继续#跳到循环的顶部以尝试下一个字符串
a、 b=匹配.groups()#解包匹配组
如果len(b)>=len(a):#必须小于b
持续
#与a和b一起工作
最好只使用模式长度,并像@ti7那样进行比较
可以使用regex,但是regex没有可变长度反向引用的概念。不过,您可以先测试两个As,然后测试3个As,然后测试4个As,直到达到您需要的级别。下面是一个JavaScript示例,最多可测试4个As。作为奖励,它测试任何类型的字符序列,后跟任何其他字符序列:
const输入=[
“AAB”,
“AABB”,
“AABBB”,
“AAAB”,
“AAABB”,
"AAABBB",,
“aaabbb”,
“AAAAB”,
“AAAABB”,
“AAAABBB”,
“aaaabbb”,
"aaaab",,
“aaaabb”,
“AAAAA BBB”,
“AAAAA BBBB”,
“aaaabbbbb”,
];
常量正则表达式=/^(?:()\1(?![^\1]{2})|()\2(?![^\2]{3})|()\3\3(?![^\3]{4})|()\4\4(?![^\4]{5}));
input.forEach(str=>{
console.log(str+'=>'+regex.test(str));
});代码>用于PCRE兼容引擎的基于正则表达式的解决方案。(应支持子例程和lookarounds)
该模式确实有点复杂,正如其他答案中提到的,定制代码可能是适合您场景的正确选择
方法:
- 先匹配“A”
- 在递归中,每个
A
都可以与AB
演示:
模式:
^(?'r'(.)
(?>(?=\2)(?&r)(.|$)(?=\3|$)
|)
)$
细分:
^(?'r'(.)
(?>(?=\2)(?&r)(.|$)(?=\3|$)
|)
)$
(?'r'…)
:定义名为r
的子例程
()
:匹配任何字符。在组中捕获它\2
(?=\2)(?&r)(.|$)(?=\3 |$)
:下一个字符与当前字符匹配。
(?=\2)
:“正向前瞻”检查下一个字符是否匹配\2
。(直到第一次B
)为止
(?&r)
:调用子例程r
。(递归)
(.|$)(?=\3 |$)
:这将在递归后匹配。
- 匹配
或$
并将其捕获到\3
中
- 它后面应该跟有
\3
或$
- 或返回成功(对于第一个
B
)
因此,它不能仅用正则表达式实现?它可能有一个巧妙的反向引用(尽管您可能需要一个扩展的正则表达式库),当然这是一个有效且有趣的问题,不管是否可能!然而,您的代码可能会更难阅读,效率也会降低。这是否回答了您的问题?