如果我有一个格式如下的字符串:
"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对象。因此,在这种情况下,“名称”,“数字”和“地点”代表关键值。它们不是固定的,这只是一个例子。
答案 0 :(得分:2)
正则表达式:
,(.*?(?:,|$))
替换字符串:
:$1
示例:强>
> '"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 :(得分:0)
替代([^,]+),([^,]+,)
到\1:\2
全球适用一次。
必须申请一次。除非是最后一个,否则将成为:。
答案 3 :(得分:0)
好的,这是一个更新的答案,(ab)使用JSON.parse
和JSON.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;
}
答案 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;或者是真的。