HackerRank正向引用挑战正则表达式匹配失败求助
HackerRank正向引用挑战正则表达式匹配失败求助
嘿,我来帮你分析下你的正则问题出在哪~
先回顾下任务的三个核心要求:
- 字符串只能由
tic或tac组成 tic不能和自己相邻- 第一个
tic必须在至少两个tac出现之后
你的正则/^(tac){2,}(tic)(\1{1,}\2{1}){0,}/有两个关键问题:
1. 没有锚定字符串结尾
你的正则只加了开头锚点^,但没加结尾锚点$,这意味着只要字符串开头部分符合规则,test()就会返回true,不管后面的内容是什么。比如测试用例tactactactictactictic,你的正则会匹配到前面的tactactactictacti就满足条件了,完全忽略了最后多余的那个tic,所以返回了错误的true。
2. 正则结构无法阻止连续的tic
再看你的正则结构:^(tac){2,}(tic)(\1{1,}\2{1}){0,},其中(\1{1,}\2{1})代表“一个或多个tac + 一个tic”的重复。但这个结构只规定了在第一个tic之后,后续的tic必须跟着tac,却没有限制“不能直接在tic后面再接tic”——而且因为没有结尾锚点,就算后面出现连续tic,正则也不会检查到。
正确的正则写法
我们需要确保:
- 整个字符串完全匹配规则(加
^和$) - 第一个
tic前至少有两个tac - 任何
tic后面都不能直接跟tic,必须有tac隔开(或者在字符串结尾)
可以用这个正则:
const reg = /^(tac){2,}(?:tac+tic)*tac*$/;
解释下这个正则的各部分:
^(tac){2,}:确保开头至少有两个tac(?:tac+tic)*:非捕获组,允许0次或多次“一个或多个tac+ 一个tic”的组合,这样保证每个tic前面都有tac,避免连续tictac*:允许字符串结尾是任意数量的tac(包括0个,也就是结尾可以是tic)$:锚定结尾,确保整个字符串都符合规则
用这个正则测试你的失败用例tactactactictactictic,会返回false,因为最后两个tic无法匹配(?:tac+tic)*的结构,而且结尾锚点会检查整个字符串,所以能正确识别不符合规则的情况。
备注:内容来源于stack exchange,提问作者ZenZ
相关产品推荐
相关产品推荐

