我有一个类似*Task @Context >Delegation --Date
的字符串,我想在分隔符*@>
和--
之间提取字符串。
*Task @Context >Delegation --Date
应该产生四个字符串Task
,Context
,Delegation
和Date
以及*Task 9-5 @Co-ntext >Dele-gation --Date 12-5
Task 9-5
,Co-ntext
,Dele-gation
和Date 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 -
答案 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