使用 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​​ 和正则表达式从字符串中提取键值对的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式从文件中提取 JSON 键值映射

ruby Amazon ASIN正则表达式和Ruby用于从逗号分隔或换行符分隔的textarea中提取asins

Ruby Regex 从电子邮件地址中提取域

如何使用正则表达式和外壳从字符串中提取值?

使用正则表达式从字符串中提取数字和符号

使用 sed 和正则表达式从字符串中提取数字