我正在编写一段需要捕获字符串中多个模式实例的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]/
我需要做些什么才能捕获字符串中模式的所有实例?
答案 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:Value1
,My_Key:My_value
或Key2:
等实例(没有值)。
(?is)
使匹配大小写不敏感,并使换行符(分隔行)与\n
和\r\n
匹配。 [a-z0-9_]+
匹配“key1:value1
”对左侧的任何字母,数字和下划线序列。在括号中添加额外字符以匹配更多种类的可能键名。在您到达空白区域(如空格,制表符或行尾)之前,[^\s]*
匹配“:”后面的最长字符序列。如果右侧没有值,它也会返回“Key1:
”,因此如果您不想匹配,则使用+
代替*
。{ p>
答案 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()