【问题标题】:Parse key-value map string in groovy在groovy中解析键值映射字符串
【发布时间】:2019-08-09 14:53:26
【问题描述】:

我在 groovy 中使用 unix shell .execute 命令调用后端服务器 (DSDB) 得到了一些输出。它给我的是由一行分隔的键值对列表,每对由冒号分隔。我需要将每个键值对放入地图中。这是我收到的输出:

Group Name:  groupName
       GID:  12345
      Type:  1
  Comments:
Visibility:  visibile1
Owner Name:  name1
Owner Number:  123
Manager Name:  manager1
Manager Number:  234
Environment:  dev
     State:  0

我需要在一个函数中获取 Owner Name 的值并将其作为变量传回,我还需要另一个函数中的 environment 的值。这将是两个独立的函数。

【问题讨论】:

  • 你应该展示你到目前为止写的代码。您可以在不使用任何正则表达式的情况下按行拆分字符串,并通过第一个冒号拆分每行。除非你有“cmets:”的多行值
  • 考虑像这样的现有问题stackoverflow.com/questions/2812689/…

标签: groovy


【解决方案1】:

找不到一个可以完成所有这些的正则表达式,但有一些常规的修复:

final data = """
Group Name:  groupName
       GID:  12345
      Type:  1
  Comments:
Visibility:  visibile1
Owner Name:  name1
Owner Number: 123
Manager Name: manager1
Manager Number: 234
Environment: dev
State: 0
"""

final a = (data =~ /\s*([^:]+):(.*)/) 
    .collect { [it[1], it[2].trim()] }
    .collectEntries()

assert a["Owner Name"] == "name1"
assert a["Environment"] == "dev"

Java 模式默认处于“单行模式”。此正则表达式匹配以冒号分隔的键和值,并为每一行找到一个匹配项。

collect 然后将匹配项映射到元组中。我还滥用此步骤从值中删除前导空格(“评论”字段除外,它没有值)。

最后,collectEntries 可用于将元组列表映射到单个映射中。

【讨论】:

    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 2012-08-27
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2013-05-18
    相关资源
    最近更新 更多