2014-10-07 234 views
1

我想从下面的字符串中找到一个模式。所有包含“MATCH.TEXT3”的单词,可能是最后一个匹配结尾的单词。Groovy - 从字符串中提取并显示子字符串

{MATCH.TEXT1.1=[1, admin, 07/10/14 09:29:34], MATCH.TEXT2.2=[2, admin, 07/10/14 10:01:08], MATCH.TEXT3.3=[3, admin, 07/10/14 10:08:01], MATCH.TEXT3.4=[4, admin, 07/10/14 11:08:01], MATCH=[TEXT3]} 

预期输出:

MATCH.TEXT3.4 

or 

MATCH.TEXT3.3 
MATCH.TEXT3.4 
+0

你有什么已经尝试过? – Opal 2014-10-07 06:04:42

+0

新手到groovy,我使用string.find(“MATCH.TEXT3。*”)做了很长的路要走,然后,由','分裂导致多个值 – 2014-10-07 06:28:41

+1

字符串的来源是什么?看起来像来自matcher或json的'toString()'。 – cfrick 2014-10-07 07:52:06

回答

5

您可以使用字符串的findAll()方法来提取匹配给定的模式标记:

String s = '{MATCH.TEXT1.1=[1, admin, 07/10/14 09:29:34], MATCH.TEXT2.2=[2, admin, 07/10/14 10:01:08], MATCH.TEXT3.3=[3, admin, 07/10/14 10:08:01], MATCH.TEXT3.4=[4, admin, 07/10/14 11:08:01], MATCH=[TEXT3]}' 

List<String> tokens = s.findAll(/MATCH\.TEXT3(\.[0-9]+)?/) 

assert tokens == ['MATCH.TEXT3.3', 'MATCH.TEXT3.4'] 

String last = tokens.last() 

assert last == 'MATCH.TEXT3.4' 
+0

这个答案也有效,但我不得不接受Haim的回答,因为它给了我最后一场比赛,这正是我期待的 – 2014-10-08 05:49:49

+0

获取最后一个元素更加容易: String last = tokens.last()检查更新后的示例代码。这是不太嘈杂的恕我直言 – 2014-10-08 06:16:17

1

对于最后一场比赛:

class Finder { 
    static main(args) { 
     def str = '''<your string>''' 
     def textFinder= /(MATCH.TEXT3.\d+)/ 
     def textMatcher = str=~textFinder 
     if(textMatcher.size()>0){ 
      def lastMatch = (Integer) textMatcher.size() - 1 
      println (textMatcher=textMatcher[lastMatch][1])   
     } 
    } 
} 

输出:
MATCH.TEXT3.4

所有配衬是一个简单的变化。

+0

正是我在找什么,谢谢 – 2014-10-08 05:48:54

+0

Szymon的回答更清洁。我会检查他的答案。请保留我的努力;-) – 2014-10-08 08:18:56