将反向应用的正则表达式产生相同的匹配吗?

时间:2012-05-27 23:59:59

标签: regex algorithm

假设我们有一些文本和与之匹配的正则表达式。问题:如果我将相同的表达式向后应用于文本(从最后一个字母开始到第一个字母),它是否仍会匹配?

正则表达式----->文本

xereg - ? - > txet

在实践中似乎有效,问题在于理论对一般情况的说法。

4 个答案:

答案 0 :(得分:3)

如果您使用Kleene星,则不会 - 如果您反转正则表达式,您将得到无效的正则表达式或匹配不同模式的正则表达式:

  • ab* - > *ba(语法无效)
  • a*b - > b*a(第一个匹配aaab但不匹配abbb,而第二个匹配bbba但不匹配baaa

另一方面,我很确定能够设计一种算法,在给定正则表达式的情况下,生成与反向字符串匹配的正则表达式。以下递归算法应该有效(如果 r 是正则表达式, rev(r)表示与反向字符串匹配的正则表达式):

  • 如果 r 是单个符号 x ,则 rev(r)= x
  • 如果 r 是联盟 A | B ,那么 rev(r)= rev(A)| rev(B)。< / LI>
  • 如果 r 是串联 AB ,那么 rev(r)= rev(B)rev(A)
  • 如果 r 是Kleene星 A * ,那么 rev(r)= rev(A)*

答案 1 :(得分:0)

一般原因是它不会

例如,正则表达式

ab

将匹配

ab

但不是

ba

你怎么认为一般情况应该是这样?

有正则表达式与反向字符串匹配,以及

[a|b]*

将匹配

ab 

ba

答案 2 :(得分:0)

regexxeger在文本上产生相同匹配的情况包括:

  1. regex是一个简单的(原子)模式,是palindrome。例如,abcba
  2. regex由几个使用commutative函数的原子模式组成(例如or),并且您不会反转那些单独的原子模式。如果你这样做,那么他们也应该是一个回文。例如,如果您不反转原子组件,则为adef|bd881|cdavr;如果您反转原子组件,则为[aba|defed]

答案 3 :(得分:0)

一般来说,我肯定会说“不”,但这实际上只取决于表达式的复杂性。

因为不仅需要反转任何简单(子)表达式,而且如果适用,还需要考虑更复杂的东西,这在任何正则表达式中都不是那么容易“逆转”:重复算子怎么样,懒惰与贪婪,或反向引用和环顾,量词和修饰符...... - 例如在例如this tutorial

也许如果你有关于这种“逆转”的更具体的例子或问题,可以考虑更合适的答案。