You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,避免连续tic
  • tac*:允许字符串结尾是任意数量的tac(包括0个,也就是结尾可以是tic)
  • $:锚定结尾,确保整个字符串都符合规则

用这个正则测试你的失败用例tactactactictactictic,会返回false,因为最后两个tic无法匹配(?:tac+tic)*的结构,而且结尾锚点会检查整个字符串,所以能正确识别不符合规则的情况。

备注:内容来源于stack exchange,提问作者ZenZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:54:35