【问题标题】:RegEx for matching forward reference exercise用于匹配前向参考练习的正则表达式
【发布时间】:2019-05-03 14:49:36
【问题描述】:

我正在做一个关于正则表达式前向引用的练习,就像here提出的那样。

任务是:

  • 字符串 stictac 组成
  • tic 不应该是它自己的直接邻居
  • 第一个 tic 必须在 tac 之前至少出现两次时出现

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

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

有效

tactactic
tactactictactic

无效

tactactictactictictac
tactictac

我该如何解决这个问题?

【问题讨论】:

  • 您自己的正则表达式无法匹配开头有两个以上 tacs 的字符串,例如tactactactic。您已经得到了答案,但在性能方面,您应该选择更轻的正则表达式:^(tac)(\1+tic)+\1*$
  • @revo 这也是一个很好的解决方案,为什么不发布呢?
  • @Thefourthbird 我觉得它没有回答这个问题,因为 OP 明确要求提供一个涉及前向引用的解决方案,该解决方案已经给出。
  • @revo 你说得对,我猜这个练习没有足够的案例。你的也很好用。

标签: regex


【解决方案1】:

这使用前向引用:

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

Demo

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

【讨论】:

  • 谢谢。我一直在尝试如何使用forward reference 来解决,就是这样
【解决方案2】:

如果字符串中应该至少有 2 个抽动,您可以使用否定的前瞻来断言不存在抽动并开始匹配至少 2 次 tic

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

Regex demo

如果字符串也只能包含 1 个或多个 time 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+ 次直到字符串结束
  • )关闭非捕获组
  • $字符串结束

Regex demo

【讨论】:

  • 不太了解tempered greedy token 的部分,但你能不能也展示一个涉及forward reference 的部分?谢谢
【解决方案3】:

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

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

说明:

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

Regex Demo

【讨论】:

  • tactactactictactic 不应该是有效的吗?
  • 你们俩都是对的。照顾两种模式。请检查
  • 感谢您的回答,但您是否也可以容纳forward reference(但不是以多余的方式)
  • @greeny1234:很抱歉,我不确定你叫什么forward reference。您的意思是积极展望未来吗?
  • 我在问题中放了一个链接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 2023-02-26
  • 2016-12-08
  • 2010-10-10
  • 1970-01-01
相关资源
最近更新 更多