捕获字符之间的字符串并替换

时间:2018-01-30 11:47:44

标签: javascript regex string

我正在尝试使用Javascript解析QML文件,并从中创建一个JSON。 我遇到了一个我无法解决的问题。 我正在尝试替换"之间尚未存在的文件的每个字符串,并将其置于双"之间。 所以,如果我有一些像

这样的字符串
Layout.fillHeight: true
height: 200
color: "transparent"

应该成为

"Layout.fillHeight": "true"
"height": 200"
"color": "transparent"

这是我写的正则表达式,非常悲惨:

/((\S\.\S)|\w+?)(?![^"]*\")/g

(\S.\S)|w+? take every string (considering also words with . between them

两个问题:

  1. 如果一行包含2 "之间的任何字符串,则不会考虑该行的任何字词。
  2. 使用replace()我无法替换字符串,因为$1$2不包含我要替换的确切字符串。
  3. 我对Regex不太好,所以如果你们能帮助我,我们将不胜感激。

4 个答案:

答案 0 :(得分:0)

这样的东西?

删除所有引号,重新插入每行的开头和结尾,然后继续用冒号替换冒号和空格

let string = `Layout.fillHeight: true
height: 200
color: "transparent"`

console.log(string.replace(/\"/g, "").replace(/^|$/gm, "\"").replace(/\:\ /gm, "\": \""))

作为替代方案,如果它们采用数组格式开头:

function quotify(string) {
  let regex = /^\s*"?(.*?)"?:\s*"?(.*?)"?$/,
    matches = regex.exec(string);

  return `"${matches[1]}": "${matches[2]}"`;
}

let strings = ['Layout.fillHeight: true',
    'height: 200',
    'color: "transparent"'
  ],
  quotedStrings = [];

strings.forEach((string) => {
  quotedStrings.push(quotify(string))
})

let jsonString = JSON.parse(`{${quotedStrings}}`);


console.log(jsonString)

答案 1 :(得分:0)

这是一个使用两个替换的Notepad ++解决方案。如有必要,首先双键引用密钥:

<强>查找

^([^":]+):

<强>替换

"$1"

然后在必要时再次引用这些值:

<强>查找

:\s+([^"]+)$

<强>替换

"$1"

答案 2 :(得分:0)

这是一个更复杂的解决方案,仅引用尚未引用的字符串。

&#13;
&#13;
var str = `Layout.fillHeight: true
height: 200
color: "transparent"`;

var result = str.split(/\n/).map((v) => {
  return v.split(/\s*\:\s*/).map((vv) => {
      if(!isNaN(vv) || vv == "true" || vv == "false" || (vv[0] == '"' && vv[vv.length - 1] == '"')){
          return vv;
      }
      return `"${vv}"`;
    }).join(":");
}).join(",");

console.log(JSON.parse(`{${result}}`));
&#13;
&#13;
&#13;

我可能会让事情变得更加复杂,而且在处理我无法考虑的构造时很可能会失败。

答案 3 :(得分:0)

我试过REGEX @Tushar提供:

(\S+)\s*:\s*(\S+)

这是我正在寻找的那个。感谢您的贡献。