Regex 位置模式匹配

Regex 位置模式匹配,regex,Regex,我想浏览一个单词列表,找到任何符合ABCCDAA模式的单词。我该怎么做?也就是说,找到任何长度为7的单词,其字母对应于该模式(前两个字母和后两个字母是X,等等)。regex非常简单- /^([a-zA-Z])([a-zA-Z])([a-zA-Z])\3([a-zA-Z])\1\1$/ 正则表达式非常简单- /^([a-zA-Z])([a-zA-Z])([a-zA-Z])\3([a-zA-Z])\1\1$/ 以下是我的解决方案: ([a-zA-Z]).([a-zA-Z])\2.\1\1 以下

我想浏览一个单词列表,找到任何符合ABCCDAA模式的单词。我该怎么做?也就是说,找到任何长度为7的单词,其字母对应于该模式(前两个字母和后两个字母是X,等等)。

regex非常简单-

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

正则表达式非常简单-

/^([a-zA-Z])([a-zA-Z])([a-zA-Z])\3([a-zA-Z])\1\1$/
以下是我的解决方案:

([a-zA-Z]).([a-zA-Z])\2.\1\1
以下是我的解决方案:

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

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