正则表达式 - 替换逗号的所有奇数编号的出现

时间:2014-08-22 03:21:32

标签: javascript regex

如果我有一个格式如下的字符串:

"name", "bob", "number", 16, "place", "somewhere" 

而我希望有一个这样的字符串:

"name": "bob", "number": 16, "place": "somewhere" 

此外,测试用例确实有一些像这样的字符串示例:

"name", "bob", "hello, world", true

这需要格式化为:

"name" : "bob", "hello, world" : true

...每个奇怪的逗号被冒号替换(只要逗号超出引号),地球上我将如何通过正则表达式做到这一点?

我通过Google找到了以下正则表达式:/(,)(?=(?:[^"]|"[^"]*")*$)/,':',它与第一个逗号实例匹配。我如何从那里交替每一个?

修改以获取更多信息:

我要做的是使用这个字符串,其中每个值都用逗号描述,并使用.replace()将其格式化为JS对象。因此,在这种情况下,“名称”,“数字”和“地点”代表关键值。它们不是固定的,这只是一个例子。

6 个答案:

答案 0 :(得分:2)

正则表达式:

,(.*?(?:,|$))

替换字符串:

:$1

DEMO

示例:

> '"name", "bob", "number", 16, "place", "somewhere" '.replace(/,(.*?(?:,|$))/g, ':$1');
'"name": "bob", "number": 16, "place": "somewhere" '

<强>更新

如果字段名称以逗号分隔,那么您可以尝试使用以下正则表达式

> '"name", "bob", "hello, world", true'.replace(/("(?:\S+?|\S+ \S+)"), ("[^"]*"|\S+)/g, '$1: $2');
'"name": "bob", "hello, world": true'

答案 1 :(得分:1)

你可以使用这个涵盖所有比赛的正则表达式。

(?=(?:[^"]*"[^"]*")*[^"]*$)(,)(.*?,|)(?=.*?(?:,|$))

替换为::$2

Live demo

答案 2 :(得分:0)

替代([^,]+),([^,]+,)\1:\2全球适用一次。

必须申请一次。除非是最后一个,否则将成为:。

答案 3 :(得分:0)

好的,这是一个更新的答案,(ab)使用JSON.parseJSON.stringify

function formatString(input) {
    var arr = JSON.parse('[' + input + ']'),
        result = '',
        i;

    for (i = 0; i < arr.length; i++) {
        result += JSON.stringify(arr[i]);

        if (i !== arr.length - 1) {
            if (i % 2 === 0) {
                result += ': ';
            } else {
                result += ', ';
            }
        }
    }

    return result;
}

示例: http://jsfiddle.net/w9eghqmy/1

答案 4 :(得分:0)

 "(.*?)(?<=\")(\s*)\,(\s*)(\S+)"

替换为      “\ 1 \ 2:\ 3 \ 4”

这适用于所有情况。

答案 5 :(得分:0)

var str='"name", "bob", "hello, world", true';
str.replace(/("[^"]+"), ("[^"]+"|[^",]+)/g,"$1: $2");

正则表达式"[^"]+"的第一部分在引号下捕获名称:&#34; name&#34;或者&#34;你好,世界&#34;。

正则表达式("[^"]+"|[^",]+)的第二部分捕获引号下的名称或不带引号或逗号的字符串:&#34; bob&#34;或者是真的。