匹配以([*> @] | - )开头的字符串以其中一个结尾

时间:2015-06-11 01:35:57

标签: regex groovy

我有一个类似*Task @Context >Delegation --Date的字符串,我想在分隔符*@>--之间提取字符串。 *Task @Context >Delegation --Date应该产生四个字符串TaskContextDelegationDate以及*Task 9-5 @Co-ntext >Dele-gation --Date 12-5 Task 9-5Co-ntextDele-gationDate 12-5

matches = "*Task @Context >Delegation --Date" =~ /([\*@>]|--)([^\*@>\-]*)/

for (match in matches) {
    println "$match"
}

效果很好,如果字符串不包含-,但每个字符串可以包含一个(或多个)字符串。 E.g。

matches = "*Task 9-5 @Co-ntext >Dele-gation --Date 12-5" =~ /([\*@>]|--)([^\*@>\-]*)/

for (match in matches) {
    println "$match"
}

所以,我尝试了否定前瞻

matches = "*Task 9-5 @Co-ntext >Delegation A-Town --Date 12-5" =~ /([\*@>]|--)([^\*@>]*(?!--))/

for (match in matches) {
    println "$match"
}

但这不起作用。我尝试了无数组合,但我无法弄清楚如何处理两个-作为分隔符。

三种方法的输出:

First
[*Task , *, Task ]
[@Context , @, Context ]
[>Delegation , >, Delegation ]
[--Date, --, Date]
// is ok

Second
[*Task 9, *, Task 9]
[@Co, @, Co]
[>Dele, >, Dele]
[--Date 12, --, Date 12]
// problems with -

Third
[*Task 9-5 , *, Task 9-5 ]
[@Co-ntext , @, Co-ntext ]
[>Dele-gation --Date 12-5, >, Dele-gation --Date 12-5]
// problems with -

1 个答案:

答案 0 :(得分:1)

您可以在此处实施否定前瞻。

def s = "*Task 9-5 @Co-ntext >Delegation A-Town --Date 12-5" 
def m = s =~ /([@>*]|--)((?:(?![*@>]|--).)*)/
(0..<m.count).each { print m[it][2].trim() + '\n' }

<强>输出

Task 9-5
Co-ntext
Delegation A-Town
Date 12-5