使用 ruby 和正则表达式从字符串中提取键值对
Posted
技术标签:
【中文标题】使用 ruby 和正则表达式从字符串中提取键值对【英文标题】:Extracting key-value pairs from a string using ruby & regex 【发布时间】: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,或者专注于单个键值对。
【问题讨论】:
【参考方案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" 是可能的。以上是关于使用 ruby 和正则表达式从字符串中提取键值对的主要内容,如果未能解决你的问题,请参考以下文章