如何匹配自定义序列化对象格式中的所有键和值?

Oli*_*i C 5 javascript regex parsing match capturing-group

我试图从字符串形式的对象中挑选出所有值。我已经创建了正则表达式,但我仍然遇到无法删除引号并碰壁的问题......

这是我得到的结果与期望结果的比较的代码:

const regex = /(?:"([^"]+)\")|([^=",{}.]+)/g
const string = 'obj{a="0",b="1",domain="a-ss.test.io:666",f="g",range="3.594e-04...4.084e-04"}'

const matches = string.match(regex)
console.log(matches)
Run Code Online (Sandbox Code Playgroud)

这是结果数组:

[
    "obj",
    "a",
    "\"0\"",
    "b",
    "\"1\"",
    "domain",
    "\"a-ss.test.io:666\"",
    "f",
    "\"g\"",
    "range",
    "\"3.594e-04...4.084e-04\""
]
Run Code Online (Sandbox Code Playgroud)

虽然我想要的结果是:

[
    "obj",
    "a",
    "0",
    "b",
    "1",
    "domain",
    "a-ss.test.io:666",
    "f",
    "g",
    "range",
    "3.594e-04...4.084e-04"
]

Run Code Online (Sandbox Code Playgroud)

有谁知道如何从返回的每个数组值中删除引号?

Wik*_*żew 3

您需要在结果中获取完整的匹配值,因为String#match包含该/g标志的正则表达式会丢失所有捕获。看到String#match返回:

Array内容取决于全局 ( g) 标志是否存在,或者null是否未找到匹配项。

  • 如果g使用该标志,则将返回与完整正则表达式匹配的所有结果,但不包括捕获组。
  • 如果g未使用该标志,则仅返回第一个完整匹配项及其相关捕获组。在这种情况下,将返回与(具有一些额外属性的数组)match()相同的结果。RegExp.prototype.exec()

您想要获取第 1 组或第 2 组值,因此请要求引擎仅返回它们:

const regex = /"([^"]+)"|([^=",{}.]+)/g
const string = 'obj{a="0",b="1",domain="a-ss.test.io:666",f="g",range="3.594e-04...4.084e-04"}'

const matches = Array.from(string.matchAll(regex), x => x[1] || x[2])
console.log(matches)
Run Code Online (Sandbox Code Playgroud)