【问题标题】:Extracting key-value pairs from a string using ruby & regex使用 ruby​​ 和正则表达式从字符串中提取键值对
【发布时间】:2021-11-18 02:52:41
【问题描述】:

我想用 ruby​​ 完成以下任务,如果可能的话,还可以使用正则表达式:

输入:"something {\"key\":\"value\",\"key2\":3}"
输出:[["\"key\"", "\"value\""], [["\"key2\"", "3"]]

到目前为止我的尝试:

s = "something {key:\"value\",key2:3}"
s.scan(/.* {(?:([^:]+):([^,}]+),?)+}$/)

# Output: [["\"key2\"", "3"]]

由于某种原因,上面的正则表达式只匹配最后一个键值对。有人知道如何检索所有对吗?

为了清楚起见,“某物”可以是任何类型的字符串。出于这个原因,诸如 (1) 将文本直接拆分为等号或 (2) s.scan(/(?:([^:]+):([^,}]+),?)/) 中使用的正则表达式等解决方案对我不起作用。

我知道在 SO 上有类似的问题。尽管如此,据我所见,他们大多倾向于解决方案 1 和 2,或者专注于单个键值对。

【问题讨论】:

    标签: regex ruby


    【解决方案1】:

    您的字符串看起来像一个编码为字符串的 json 数据结构,只要您从字符串中删除单词“something”,您就可以使用 JSON.parse。

    require 'json'
    
    string = "something {\"key\":\"value\",\"key2\":3}"
    # the following line removes the word something 
    string = string[string.index("{")..-1]
    x = JSON.parse(string)
    puts x["key"]
    puts x["key2"]
    

    如果需要,您可以将其转换为数组

    如果你想使用正则表达式,也可以试试

    string.scan(/(?:"(\w+)":"?(\w+)"?)/)
    

    【讨论】:

    • 嗨@SomeonRandom3142,该字符串不是有效的 JSON,因此我无法使用 json 库。此外,“某事”可以是任何字符串,包括“{}:\””。所以像“\”hey\”:ho {\“key\”:\“value\”,\“key2\” :3}" 是可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 2014-10-17
    • 2018-04-03
    • 2015-03-10
    相关资源
    最近更新 更多