我有以下正则表达式模式:
(A|B|C)stuffinbetween(D|E|F)
有没有办法只匹配以下模式:
AstuffinbetweenD
BstuffinbetweenE
CstuffinbetweenF
(我想匹配它,而不必为3种模式指定3次完全展开的正则表达式...)
答案 0 :(得分:2)
如果您的正则表达式支持它,您可以使用conditionals,如下所示:
(?:(A)|(B)|C)stuffinbetween(?(1)D|(?(2)E|F))
(?(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))~
使用其他版本,您可以通过前瞻启动模式,以快速丢弃字符串中无用的位置:
(?=[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
。
希望它有所帮助。
答案 3 :(得分:0)
或者,您可以使用:
String g1 = "stuffinbetween";
String regex = "(?:A" + g1 + "D|B" + g1 + "E|C" + g1 + "F)";
:P