使用可选子组解析特定模式

时间:2014-11-20 14:51:50

标签: regex

我有一个输入字符串,符合以下模式:

'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完成吗?

1 个答案:

答案 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)块结尾的模式所必需的