注意:我更改了问题的标题以及所有对 JSON 的引用,以便问题更好地反射(reflect)我的问题。我多次收到“迭代对象比在序列化版本上工作更好”的建议,但我相信(并且肯定是错误的)在字符串中搜索定义明确的模式比迭代或递归代码更容易迭代一个对象
我需要从字符串中提取模式 "something":"thestring"
。
源字符串会有很多其他的组合比如"something":[{"thestring":{"key":18,"anotherkey":"astring"}}]
,从中仅搜索 "anotherkey":"astring"
对。
我特别感兴趣的是获取值的内容,即第一个示例中的 thestring
(以及第二个示例中的 astring
)。
我尝试匹配 ".*?","(.*?)"
但我得到的不仅仅是这对,匹配引号后的逗号(并且它从那里走下坡路) .
测试字符串的示例和我失败的测试在 Regex101 上
最佳答案
我会这样写:
function extractStrings(obj) {
var stringSet = [];
function extractStringsHelper(obj) {
if (typeof obj === 'string' && stringSet.indexOf(obj) === -1) {
stringSet.push(obj);
} else if (typeof obj === 'array') {
for (var i=0; i<obj.length; i++) {
extractStringsHelper(obj);
}
} else if (typeof obj === 'object' && obj !== null) {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
extractStringsHelper(obj[key]);
}
}
}
}
extractStringsHelper(obj);
return stringSet;
}
> extractStrings({'a': "strA", 'b': ["strB1", 1, "strB2", {'n': "strC"}]})
> (4) ["strA", "strB1", "strB2", "strC"]
您也可以使用正则表达式查找:
"[^"]+":"([^"]+)"
这是您使用修改后的正则表达式的示例:https://regex101.com/r/uxS9k0/2
但这条路是黑暗的,充满了恐怖。例如,如果字符串包含转义双引号,它就会中断。一旦开始考虑所有可能的情况,您基本上就是在重写 JSON 分词器。
关于javascript - 如何匹配 "something":"thestring"模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45573038/