注意:我更改了问题的标题,以及对JSON的所有引用,以便更好地反映我的问题。我多次得到#34的建议;更好地迭代对象而不是在序列化版本上工作#34;但我相信(并且肯定是错误和错误的)在字符串中搜索定义良好的模式比迭代或递归代码迭代对象更容易
我需要从字符串中提取模式"something":"thestring"
。
源字符串将包含许多其他组合,例如"something":[{"thestring":{"key":18,"anotherkey":"astring"}}]
,仅从中寻找"anotherkey":"astring"
对。
我特别感兴趣的是获取值的内容,即第一个示例中的thestring
(以及第二个示例中的astring
)。
我尝试匹配".*?","(.*?)"
,但我获得的不仅仅是这对,在引号后匹配逗号(并且它在那里下坡)。
测试字符串的示例和我的失败测试位于Regex101
答案 0 :(得分:3)
以下是我写这个的方法:
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标记器。
答案 1 :(得分:1)
试试这个正则表达式:
如果你真的想要处理一个字符串,这个正则表达式就可以做你想要的,只要你查找的内容总是在引号之间,并且前面带有引号之间的键:
"\w+":"(\w+)"
演示here
该值将在第1组中捕获
以下是获取价值的方法:
var regex = /"\w+":"(\w+)"/g;
var json = "\"something\":\"thestring\"\n\"something\":[{\n\t\"thestring\":{\n\t\t\"key\":18,\n\t\t\"anotherkey\":\"astring\"\n\t}\n}]";
console.log(json);
var match = regex.exec(json);
for (i = 1; match != null; i++) { // You need to loop until you match every value
// Full match is in match[0]
// Your value is in match[1]
console.log("Val"+i+": "+match[1])
match = regex.exec(json);
}
&#13;
答案 2 :(得分:0)
如果您正在使用有效的json,则不应该使用正则表达式,并且可以使用以下内容对其进行反序列化:
var data = JSON.parse(json_string);