如何用正则表达式匹配多行文本中最后一组键值对?
更通用优雅的正则实现方案
你的需求是定位JSON-like结构中最后一组键值对的特定位置(键后缀或值前缀),原正则依赖键结尾是00",通用性不足,以下是几种更通用的实现方式:
1. 匹配最后一个键值对的键后缀位置(即"xxx" : 之后)
使用带正向预查的正则,不依赖键的具体内容,只要符合"键" : 的格式即可:
/"[^"]+" : (?=(?:(?!:"[^"]+" : ).)*}$/s
- 解释:
"[^"]+" ::匹配任意合法的键格式(键可以是任意非引号字符)(?=...):正向预查,确保当前位置之后的内容直到}结尾,不再出现"键" :的格式,以此确认这是最后一个键值对s修饰符:让.匹配换行符,适配多行文本
如果你的键固定是数字,也可以把[^"]+换成\d+,更精准:
/"\d+" : (?=(?:(?!:"\d+" : ).)*}$/s
2. 匹配最后一个键值对的值前缀位置(即值之前)
可以直接基于上面的正则调整,或者匹配最后一个键值对的整体后定位:
/(?<="[^"]+" : )(?:(?!,).)*(?= *}$)/s
这个正则会直接捕获最后一个键值对的值,你可以根据需要调整捕获组来定位位置。
更可靠的替代方案:用JSON解析器处理
如果这段内容是标准JSON,不建议用正则,直接用对应语言的JSON解析工具更可靠(比如JavaScript的JSON.parse、Python的json模块):
- 解析整个JSON对象
- 提取
Values对应的对象 - 获取该对象的最后一组键值对(比如把键转为数组取最后一个,再拿到对应值)
比如JavaScript示例:
const data = JSON.parse(yourString); const values = data.Values; const keys = Object.keys(values); const lastKey = keys[keys.length - 1]; const lastValue = values[lastKey]; // 此时lastKey就是"49200",lastValue就是6,可直接定位操作
这种方法完全避免了正则的局限性,比如键或值中包含特殊字符的情况,正则容易出错,而JSON解析器能完美处理。
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

