正则表达式:基于先前捕获组的模式

时间:2015-11-27 13:17:05

标签: .net regex

我有以下正则表达式模式:

(A|B|C)stuffinbetween(D|E|F)

有没有办法只匹配以下模式:

AstuffinbetweenD
BstuffinbetweenE
CstuffinbetweenF

(我想匹配它,而不必为3种模式指定3次完全展开的正则表达式...)

4 个答案:

答案 0 :(得分:2)

如果您的正则表达式支持它,您可以使用conditionals,如下所示:

(?:(A)|(B)|C)stuffinbetween(?(1)D|(?(2)E|F))

demo

(?(1)true|false):如果定义了第1组,那么" true"别的"假"

提高模式效率

使用PCRE,您可以使用可以改善替换的S修饰符:

~(?:(A)|(B)|C)stuffinbetween(?(1)D|(?(2)E|F))~S

始终使用PCRE或Perl,您可以使用(*SKIP)控件动词跳过已经测试的字母(仅当"填充"不包含A,B或C时):

~(?=[ABC])(?:(A)|(B)|C)stuffinbetween(*SKIP)(?(1)D|(?(2)E|F))~

demo

使用其他版本,您可以通过前瞻启动模式,以快速丢弃字符串中无用的位置:

(?=[ABC])(?:(A)|(B)|C)stuffinbetween(?(1)D|(?(2)E|F))

答案 1 :(得分:1)

如果没有限制模式,就不能这样做。

使用 lookarounds 实现模式限制。

所以,要么使用前瞻(参见demo):

(A(?=stuffinbetweenD)|B(?=stuffinbetweenE)|C(?=stuffinbetweenF))stuffinbetween(D|E|F)

或者看后面:

(A|B|C)stuffinbetween((?<=Astuffinbetween)D|(?<=Bstuffinbetween)E|(?<=Cstuffinbetween)F)

请注意,对于处理未定义长度模式的第二种方法,您需要一种支持它们的正则表达式(.NET,Pypi正则表达式Python模块,JG Soft)。

答案 2 :(得分:1)

是的,你可以!

(?:A(stuffinbetween)D|B\g<1>E|C\g<1>F)

这是因为\g<1> recurses the 1st subpattern

Regex live here.

希望它有所帮助。

答案 3 :(得分:0)

或者,您可以使用:

String g1 = "stuffinbetween";
String regex = "(?:A" + g1 + "D|B" + g1 + "E|C" + g1 + "F)";

:P