Javascript 如何匹配a";“什么?”&引用;“字符串”;图案

Javascript 如何匹配a";“什么?”&引用;“字符串”;图案,javascript,regex,Javascript,Regex,注意:我更改了问题的标题以及对JSON的所有引用,以便问题更好地反映我的问题。我多次得到“迭代对象比处理序列化版本更好”的建议,但我相信(我肯定是错的)在字符串中搜索定义良好的模式比使用迭代或递归代码迭代对象更容易 我需要从字符串中提取模式“something”:“thestring” 源字符串将有许多其他组合,例如“something”:[{“thestring”:{“key”:18,“anotherkey”:“astring”}],从中仅查找对“anotherkey”:“astring” 我

注意:我更改了问题的标题以及对JSON的所有引用,以便问题更好地反映我的问题。我多次得到“迭代对象比处理序列化版本更好”的建议,但我相信(我肯定是错的)在字符串中搜索定义良好的模式比使用迭代或递归代码迭代对象更容易

我需要从字符串中提取模式
“something”:“thestring”

源字符串将有许多其他组合,例如
“something”:[{“thestring”:{“key”:18,“anotherkey”:“astring”}]
,从中仅查找对
“anotherkey”:“astring”

我特别感兴趣的是获取值的内容,即第一个示例中的
thestring
(第二个示例中的
astring

我试图匹配
“*?”,“(.*?”
,但我得到的不仅仅是这对,匹配引号后的逗号(这里的形式很简单)


测试字符串和我失败的测试的一个示例是on

如果您使用的是有效的json,则不需要使用regex,并且可以使用以下命令对其进行反序列化:

var data = JSON.parse(json_string);

如果您使用的是有效的json,则不需要使用regex,并且可以使用以下命令对其进行反序列化:

var data = JSON.parse(json_string);

下面是我写这篇文章的方式:

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"]
下面是您使用修改后的正则表达式的示例:


但这条路是黑暗的,充满了恐惧。例如,如果字符串包含转义双引号,则它将中断。一旦您开始考虑所有可能的情况,您基本上就是在重写JSON标记器。

下面是我将如何编写的:

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"]
下面是您使用修改后的正则表达式的示例:


但这条路是黑暗的,充满了恐惧。例如,如果字符串包含转义双引号,则它将中断。一旦开始考虑所有可能的情况,基本上就是在重写JSON标记器。

试试这个正则表达式:
如果您真的想处理字符串,这个正则表达式将执行您想要的操作,只要您查找的内容始终在引号之间并在引号之间加上一个键:
“\w+”:“(\w+)”


演示

该值将在组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}];
log(json);
var match=regex.exec(json);
对于(i=1;match!=null;i++){//需要循环,直到匹配每个值
//完全匹配在匹配[0]中
//您的值与[1]匹配
console.log(“Val”+i+:“+match[1])
match=regex.exec(json);

}
试试这个正则表达式:
如果您真的想处理字符串,这个正则表达式将执行您想要的操作,只要您查找的内容始终在引号之间并在引号之间加上一个键:
“\w+”:“(\w+)”


演示

该值将在组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}];
log(json);
var match=regex.exec(json);
对于(i=1;match!=null;i++){//需要循环,直到匹配每个值
//完全匹配在匹配[0]中
//您的值与[1]匹配
console.log(“Val”+i+:“+match[1])
match=regex.exec(json);

}
您要匹配的值总是在引号之间,并且前面有一个键,该键也在引号之间?为什么不创建一个临时对象,并找到字符串?(“[\u a-zA-Z0-9]+”):(“[\u a-zA-Z0-9]+”)@Gawil:是的,这就是您让自己的生活更加困难的结构。只需访问对象。您要匹配的值总是在引号之间,前面有一个键,也在引号之间?为什么不创建一个临时对象,然后查找字符串?(“[\u a-zA-Z0-9]+”):(“[\u a-zA-Z0-9]+”)@Gawil:是的,这就是您让自己的生活更加困难的结构。只要访问这个对象,我就有这个对象,然后从那里序列化。字符串化的目的是将对象展平,以便更容易地提取字符串(而不是遍历字符串)。我确实拥有对象,并从中序列化。字符串化的目的是将对象展平,以便更容易地提取字符串(而不是在其中穿行)