字符串:
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'我想看看是否是相同的模式。
答案 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
是捕获组的名称,then
和else
是任何有效的正则表达式
(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
这将匹配第一行和第三行,但不匹配第二行。