正则表达式以匹配前向参考练习

时间:2019-05-03 14:49:37

标签: regex

我正在进行正则表达式前向引用的练习,就像被问到的here

任务是:

  • 字符串 s tic tac
  • 组成
  • tic 不应是其自身的直接邻居
  • 第一个 tic 必须仅在 tac 至少出现两次之前出现

我已使用此regex来解决它。但是它不使用forward reference,所以我真的很想知道如何使用它来解决这个问题。

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

有效

tactactic
tactactictactic

无效

tactactictactictictac
tactictac

如何解决此问题?

3 个答案:

答案 0 :(得分:2)

如果字符串中至少应包含2个抽动,您可以使用否定的前行断言不存在抽动,并通过匹配并至少进行2次tic

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

Regex demo

如果该字符串也只能包含1个或多个tac,则可以使用交替形式:

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

Regex demo

答案 1 :(得分:2)

这个简单的正则表达式应该足够好,没有环顾四周或贪婪的贪婪令牌,因为它们在匹配方面非常昂贵。

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

说明:

  • ^tac-以tac开头的字符串
  • (tac(?:tic)?)+-这与tac匹配,并可选地跟着tic,因此不会再出现两个tic,并且由于tic是可选的,因此,它可以根据需要匹配tac多次以匹配模式。
  • $-字符串结尾

Regex Demo

答案 2 :(得分:2)

这使用前向引用:

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

Demo

实际上与this page上给出的示例非常相似。