regEx匹配所有括在方括号中的双引号

q35jwt9p  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(136)

想找人帮忙。我需要匹配{}方括号之间的所有双引号。然后我将转义这些双引号。

(37, "2012 Fall", null, null, 0, 1, "1420", {"canDelete":false, "cantDeleteModes":[2, 3, 5]}, "2020-05-28T18:06:48.000Z", "2020-10-27T19:42:03.000Z", 1, 1);

这是我到目前为止的reqex。

/(?<=\{).*?(?=\})/g

但它匹配{}括号之间的所有内容。
预期输出...

(37, "2012 Fall", null, null, 0, 1, "1420", {\"canDelete\":false, \"cantDeleteModes\":[2, 3, 5]}, "2020-05-28T18:06:48.000Z", "2020-10-27T19:42:03.000Z", 1, 1);

任何帮助将不胜感激;=)

hc8w905p

hc8w905p1#

这段代码应该让你开始:

const input = `(37, "2012 Fall", null, null, 0, 1, "1420", {"canDelete":false, "cantDeleteModes":[2, 3, 5]}, "2020-05-28T18:06:48.000Z", "2020-10-27T19:42:03.000Z", 1, 1);`

const regex = /{(.*)}/

const substr = input.match(regex)[1]
const replacement = substr.replaceAll('"', '\\"')

const result = input.replace(substr, replacement)

console.log(result)

说明

  • /{(.*)}/非延迟地匹配方括号之间的所有内容{}
  • input.match(regex)[1]-返回第一个匹配的字符串
    备注:

这是我最容易写和理解的解决方案。如果你需要一些更高性能的东西,一种可能的方法是迭代字符串的字符,注意任何{}方括号,只有当之前看到左方括号但没有右方括号时才替换引号(并跟踪多个左方括号和右方括号,以便注意开始。所以你需要某种“级别”计数器,它根据开括号和闭括号的出现而增加和减少)。

brgchamk

brgchamk2#

如果你想匹配canDelete和cantDeleteModes,你可以做得比正则表达式更好

const str = `(37, "2012 Fall", null, null, 0, 1, "1420", {"canDelete":false, "cantDeleteModes":[2, 3, 5]}, "2020-05-28T18:06:48.000Z", "2020-10-27T19:42:03.000Z", 1, 1)`
const arr = JSON.parse(`[${str.slice(1,-1)}]`)
console.log(arr)
console.log(Object.entries(arr[7])); // use Object.keys to just get the key or Object.values to just get the values
oiopk7p5

oiopk7p53#

解析JSON应该使用JSON.parse来完成,但是对于regexp,您可以使用regexpAssert和RegExp::exec来增量搜索字符串。请注意,我们在匹配中包含引号,因为我们想在下一个exec中跳过它们。额外的regexp组帮助我们得到不带引号的结果。
但是这个解决方案是脆弱的,因为如果你把花括号放在你的字符串里面,它可能会失败。如果源字符串不符合JSON,那么更好的选择是编写自己的解析器。

const str = '(37, "2012 Fall", null, null, 0, 1, "1420", {"canDelete":false, "cantDeleteModes":[2, 3, 5]}, "2020-05-28T18:06:48.000Z", "2020-10-27T19:42:03.000Z", 1, 1, {"cantDelete":false, "cantDeleteModes":[2, 3, 5]});';

const regexp = new RegExp('(?<=\{[^}]*)"([^"]+)"', 'g');

const matches = [];
let match;
while(match = regexp.exec(str)){
  matches.push(match[1]);
}

console.log(matches);

相关问题