Regex 用于匹配正向参考练习的正则表达式

Regex 用于匹配正向参考练习的正则表达式,regex,Regex,我正在做一个关于正则表达式正向引用的练习,就像所问的那样 任务是: 字符串s由tic或tac tic不应该是它自己的近邻 第一个tic必须在tac之前至少出现两次时发生 我用这个regex来解决它。但是它不使用前向引用,所以我很想知道如何使用它来解决这个问题 ^tac(tac)+(tic(tac)+){0,}(tic)?$ 有效: tactactic tactactictactic tactactictactictictac tactictac 无效: tactactic tactac

我正在做一个关于正则表达式正向引用的练习,就像所问的那样

任务是:

  • 字符串s由tictac
  • tic不应该是它自己的近邻
  • 第一个tic必须在tac之前至少出现两次时发生
我用这个
regex
来解决它。但是它不使用前向引用,所以我很想知道如何使用它来解决这个问题

^tac(tac)+(tic(tac)+){0,}(tic)?$
有效

tactactic
tactactictactic
tactactictactictictac
tactictac
无效

tactactic
tactactictactic
tactactictactictictac
tactictac

我如何解决这个问题

如果字符串中至少有2个tic,您可以使用负前瞻来断言不存在tic,并从匹配和至少2次
tic开始

^(?!.*tictic)(?:tac){2}tic(?:t[ai]c)*$

如果字符串也只能由1个或多个时间tac组成,则可以使用替代选项:

^(?:(?:tac)+|(?!.*(tictic))(?:tac){2,}tic(?:t[ia]c)*)$
  • ^
    字符串的开头
  • (?:
    非捕获组
    • (?:tac)+
      仅重复1+次tac
    • |
    • (?!*(tictic))
      断言右侧的内容不包含tactac
    • (?:tac){2,}(?:t[ia]c)*
      重复2+次tac,然后是tic,并重复tic或tac 0+次,直到字符串结束
  • 关闭非捕获组
  • $
    字符串结尾

这个简单的正则表达式应该足够好了,不需要任何环顾四周或标记,因为它们在匹配方面非常昂贵

^tac(tac(?:tic)?)+$
说明:

  • ^tac
    -字符串开头为
    tac
  • (tac(?:tic)?+
    -这匹配
    tac
    ,可选地后跟
    tic
    ,因此不会同时出现两个
    tic
    ,并且由于
    tic
    在这里是可选的,因此它允许根据需要匹配
    tac
  • $
    -字符串结尾

这使用正向引用:

^(\2tic |(tac))+$

实际上,它与上给出的示例非常相似。

TactActic
不应该有效吗?你们都是对的。注意两种模式。请检查谢谢您的回答,但您是否也可以容纳
转发参考
(但不能以冗余方式)@greeny1234:对不起,我不确定您称之为
转发参考
。你的意思是积极向前看吗?我在问题中添加了一个链接,没有完全理解关于
的部分,但是你能展示一个涉及
转发参考的链接吗?谢谢你。我一直在尝试如何使用
前向引用
来解决这个问题,这是因为您自己的正则表达式无法匹配开始时有两个以上
tac
s的字符串,例如
tactActic
。您已经得到了答案,但为了提高性能,您应该选择一个更轻的正则表达式:
^(tac)(\1+tic)+\1*$
@revo这也是一个很好的解决方案,为什么不发布它呢?@Thefourthbird我觉得它没有回答这个问题,因为OP明确要求一个包含已给出的正向引用的解决方案。@revo您是对的,我想这次演习没有足够的案例。你的也很好用。