【问题标题】:Position pattern matching位置模式匹配
【发布时间】:2011-01-24 22:06:28
【问题描述】:

我想查看一个单词列表并找到任何与 ABCCDAA 模式匹配的单词。我怎样才能做到这一点?也就是说,找到任何长度为 7 且字母与该模式相对应的单词(前两个字母是 X,等等)。

【问题讨论】:

  • 你能举一个模式的例子和几个你想/不想匹配的词吗?
  • 我做到了! ([a-zA-Z]).([a-zA-Z])\2.\1\1
  • 仅供参考,你不能用经典的正则表达式做这样的事情 - 但幸运的是,当前的正则表达式引擎比理论计算机科学中的“正则表达式”强大得多。
  • @ThiefMaster - 反向引用(这是我的回答中使用的唯一非经典特性)不会增加任何表达能力,您仍然可以使用经典正则表达式或 DFA 来做到这一点,但正则表达式会有数百个字符长 - 您必须将每个可能的 As 和 Cs 枚举为单独的分支 - 即它将是 (a[a-z](aa|bb|cc|dd| ...)[a-z]aa|b[a-z](aa|bb|cc|...)bb|...) 非常非常长且令人沮丧
  • @ThiefMaster - 走极端,这实际上是一种有限语言(有限数量的字符串匹配),因此它始终可以表示为经典正则表达式 - 只需列出每种可能性作为替代方案。即使是看似受限的上下文无关语言,也可以通过这种方式使其成为常规语言,例如如果n 为2,则最多为n 对匹配的大括号的所有可能字符串类似于^(|{}|{}{}|{{}})$

标签: regex


【解决方案1】:

正则表达式很简单 -

/^([a-zA-Z])([a-zA-Z])([a-zA-Z])\3([a-zA-Z])\1\1$/

【讨论】:

    【解决方案2】:

    这是我的解决方案:

    ([a-zA-Z]).([a-zA-Z])\2.\1\1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 2012-06-13
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多