正则表达式匹配模式不值

时间:2014-07-15 09:52:24

标签: regex

字符串:

a = 10
b = 50
c = a + b

正则表达式:

([a-z]) = (\d+)|([a-z]) = ([a-z]) \+ ([a-z])

我希望将第一组模式与最后3组相匹配,而不是将其匹配,以避免重复它。

这样的东西
([a-z]) = (\d+)|\1 = \1 \+ \1

而不是\ 1评估' a'我想看看是否是相同的模式。

2 个答案:

答案 0 :(得分:1)

一些正则表达式引擎(例如PHP的PCRE引擎,Perl和Ruby)支持subroutines

preg_match('/([a-z]) = (\d+)|((?1)) = ((?1)) \+ ((?1))/', $subject)

请注意,为了继续捕获这些子例程的内容,您需要一组额外的括号。因此(?1)充当[a-z]的“占位符”,((?1))捕获新捕获组中的占位符。

如果您的语言的正则表达式引擎没有,您仍然可以使用字符串操作来实现子模式。例如,在Python中:

>>> import re
>>> letter = "([a-z])"
>>> regex = re.compile(r"{0} = (\d+)|({0}) = ({0}) \+ ({0})".format(letter))

答案 1 :(得分:1)

如果您的GREP方言支持它:使用命名条件结构。

  

(?(<name>)then|else)其中name是捕获组的名称,thenelse是任何有效的正则表达式
  (http://www.regular-expressions.info/refadv.html)。

以下正则表达式最初匹配初始小写或一组数字。匹配存储在本地捕获组#2(小写)#3(数字)中。然后,条件指令?(2)测试组#2是否匹配任何东西。如果是这样的话,其余的正则表达式的前半部分都会被测试,如果不是,那么下半部分就是。

\l = ((\l)|(\d+))(?(2) \+ \l| \+ \d+)

在简短的测试清单上

a = 10 + 15
b = 50 + b
c = a + b

这将匹配第一行和第三行,但不匹配第二行。