如何使用Ruby及正则表达式从带任意前缀的字符串中提取全部键值对
解决方案
核心问题说明
原有写法仅返回最后一个键值对的原因是:正则中重复使用捕获组时,每个捕获组仅会保留最后一次匹配的结果,你将键值对匹配规则放在了重复分组+内部,因此只会留存最后一组捕获内容。
可行实现方案
两种方案均不会命中前面something部分的内容,符合你的要求:
方案1:先提取目标区间再扫描(逻辑清晰易维护)
先提取字符串末尾大括号包裹的内容,再对该区间单独扫描键值对:
s = "something {\"key\":\"value\",\"key2\":3}" # 提取末尾大括号内部的内容 brace_content = s.match(/.*\{(.*)\}$/)[1] # 扫描得到所有键值对 result = brace_content.scan(/([^:,]+):([^,}]+)/) # 输出:[["\"key\"", "\"value\""], ["\"key2\"", "3"]]
方案2:单正则一步匹配
使用\G锚点限定匹配范围,该锚点会在上一次匹配结束的位置继续匹配,保证所有键值对仅在大括号内部命中:
s = "something {\"key\":\"value\",\"key2\":3}" result = s.scan(/(?:.*?\{|\G(?!^))([^:,]+):([^,}]+)(?:[,}])/) # 输出结果与预期一致
内容的提问来源于stack exchange,提问作者magum
相关产品推荐
相关产品推荐

