我有一个输入字符串,符合以下模式:
'A)any string B) any other string C) third different string D)last free string'
其中任何子组是可选的,例如两者都是正确的输入:
'A)any string D)last free string'
'D)last free string'
有没有办法编写一个匹配子表达式的正则表达式:
'A)any string'
'B) any other string'
'C) third different string'
'D)last free string'
我试过贪心:
(A\).*)?(B\).*)?(C\).*)?(D\).*)?
还懒惰:
(A\).*?)?(B\).*?)?(C\).*?)?(D\).*?)?
但两种方法都不正常。
这可以用regexp完成吗?
答案 0 :(得分:0)
您可以使用
(A\).*?(?=B\)|C\)|D\)))?(B\).*?(?=C\)|D\)))?(C\).*?(?=D\)))?((A\)|B\)|C\)|D\)).*)?
作为模式。详细说明:
(A\).*?(?=B\)|C\)|D\)))?
(...)?
因为您已使用整个块是可选的A\)
该块必须以A)
.*?
任何字符串,但对于下一个语句不合适(?=B\)|C\)|D\))
预测B)
,C)
或D)
。在此之前结合使用ungreedy语句会在找到X)
之一后立即停止整个表达式下一个块:
(B\).*?(?=C\)|D\)))?
(...)?
与上述相同B\)
该块必须以B)
.*?
与上述相同(?=C\)|D\))
与上述相同,但仅针对C)
或D)
下一个块:
(C\).*?(?=D\)))?
(...)?
与上述相同C\)
该块必须以C)
.*?
与上述相同(?=C\)|D\))
与上述相同,但仅针对D)
下一个块:
((A\)|B\)|C\)|D\)).*)?
(...)?
与上述相同(A\)|B\)|C\)|D\))
该块必须以A)
,B)
,C)
或D)
.*
任何字符串,但贪婪。否则只是一个空字符串最后一个块是匹配单个模式(仅包括D)
)或不以D)
块结尾的模式所必需的