【发布时间】: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