捕获字符串中多次出现的模式

时间:2013-10-18 20:32:29

标签: regex groovy

我正在编写一段需要捕获字符串中多个模式实例的Groovy。具体来说,字符串应如下所示:

"Blah blah blah blah key1:value1 key2:value2 blah blah blah key3:value3"

我需要捕获:key1:value1,key2:value2& KEY3:值3。

我认为正则表达式看起来像这样

def regex = ~/[^|\s](.+:.*)[$|\s|\n]/

我需要做些什么才能捕获字符串中模式的所有实例?

3 个答案:

答案 0 :(得分:0)

如果您的“商品”被空白隔开(并且没有商品本身包含空白),您可以使用此商品:

 def somestring = "Blah blah blah blah key1:value1 key2:value2 blah blah blah key3:value3"

 assert somestring.split().findAll{it.contains ':'} == ["key1:value1", "key2:value2", "key3:value3"]

当然,这只会将“key:value”项目作为字符串。 (虽然从值中分离键是另一个微不足道的步骤。) 也许你可以更详细地说明你的要求。

答案 1 :(得分:0)

def regex = ~/(?is)[a-z0-9_]+:[^\s]*/

此正则表达式将匹配Key1:Value1My_Key:My_valueKey2:等实例(没有值)。

(?is)使匹配大小写不敏感,并使换行符(分隔行)与\n\r\n匹配。 [a-z0-9_]+匹配“key1:value1”对左侧的任何字母,数字和下划线序列。在括号中添加额外字符以匹配更多种类的可能键名。在您到达空白区域(如空格,制表符或行尾)之前,[^\s]*匹配“:”后面的最长字符序列。如果右侧没有值,它也会返回“Key1:”,因此如果您不想匹配,则使用+代替*

答案 2 :(得分:0)

您也可以尝试:

def s =  "Blah blah blah blah key1:value1 key2:value2 blah blah blah key3:value3"

def m = s =~ /(([^\s]+​):([^\s]+))/

m.collect { x -> x.drop( 2 ) }.collectEntries()