如何使用正则表达式来要求复杂的变化结构?

时间:2014-03-13 13:51:04

标签: java regex

我有一些像这样的字符串:

  

text {TAG_A:text | TAG_B:text} text {TAG_A:text | TAG_B:text} text ...

或者

  

text {TAG_A:text | TAG_C:text | TAG_D} {TAG_A:text | TAG_D:text} text text ...

或者甚至可能

  

{TAG_B:text | TAG_A:text} text {TAG_D:text | TAG_B:text | TAG_A:text} text text ...

非支撑和支撑组的交替没有固定的模式,它可以从任何一种开始。

A'有效'在这种情况下,支撑组意味着支撑组至少有TAG_A 其中一个TAG(TAG将始终具有相同的名称和大写)。仅存在TAG_A到TAG_D。每个TAG后面都必须跟冒号:'并且至少有一个字符(任何字符)之后。由于每组至少需要2个TAG,因此总会有至少一个管道' |'将它们分开,并为每个TAG包括额外的管道。支架中的TAG也没有订单。

我需要在这里使用正则表达式做两件事。首先,我需要一个正则表达式,可以确定是否有任何有效的'支持团体。其次,可以使用Java的Matcher.find()为每个有效的'循环使用正则表达式。支持组。

我并不关心捕捉非支撑群体,但如果可能的话,它仍然很好。只要告诉我,如果我遗漏了一些含糊不清的内容,请尽量澄清,并提前感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

此模式应与您描述的标记相匹配,包括测试是否存在TAG_A

\{(TAG_[B-D]:[^|]+?\|)*TAG_A:[^|]+?(\|TAG_[B-D]:[^|]+?)*\}

答案 1 :(得分:-1)

我真的没有看到问题。你可以匹配

{TAG_A:[^}]+}

循环点击并通过拆分“|”来确定有多少其他标签?