【问题标题】:Capturing multiple occurrences of a pattern in a string捕获字符串中多次出现的模式
【发布时间】:2013-10-18 20:32:28
【问题描述】:

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

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

我需要捕获:key1:value1、key2:value2 & key3:value3。

我认为正则表达式应该是这样的

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

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

【问题讨论】:

  • 澄清一下,我遇到的最大挑战不是创建正则表达式,而是创建 groovy 代码以将字符串中模式的所有实例作为数组提供给我。

标签: regex groovy


【解决方案1】:

如果您的“项目”由空格分隔(并且没有项目本身包含空格),您可以使用:

 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”项作为字符串提供给您。 (尽管从值中拆分键是另一个简单的步骤。) 也许您可以更详细地说明您的要求。

【讨论】:

  • 如果所有键值对都用空格、换行符或者是字符串的开头或结尾怎么办?
【解决方案2】:
def regex = ~/(?is)[a-z0-9_]+:[^\s]*/

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

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

【讨论】:

  • 这看起来不错,但是获得每个匹配项的 groovy 代码会是什么样子?我想将每个键值对作为数组的一个元素。所以,在 "blah blah key1:value1 key2:value2" 上运行它应该给我 {"key1:value1", "key2:value2"}
  • 我担心虽然我对正则表达式的了解足以在这方面提供帮助,但我对 Groovy 语言一点也不熟悉。似乎String ans = str.findAll( /(?is)[a-z0-9_]+:[^\s]*/ ) 应该返回一个包含所有匹配项的向量。
  • def machter = yourstring =~ regex 使用该匹配器,您可以以集合方式访问每个匹配项:assert matcher[0] == "key1:value1"; assert matcher[1] == "key2:value2"; assert matcher[2] == "key3:value3"; 查看文档:groovy.codehaus.org/Regular+Expressions
【解决方案3】:

你也可以试试:

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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    相关资源
    最近更新 更多