【问题标题】:Matching a line protocol string with regex in JavaScript将线路协议字符串与 JavaScript 中的正则表达式匹配
【发布时间】:2021-10-01 19:54:00
【问题描述】:

我正在尝试匹配这样的字符串:test0,id=28084 type=high,18765003 138456387

我正在使用这个正则表达式:

const str = `test0,id=28084 type=high,18765003 138456387`;

console.log(str.match(/\s*([a-zA-Z0-9\-_.]+)\s*,\s*([a-zA-Z0-9\-_.]+\s*=\s*[a-zA-Z0-9\-_.]+\s*)*\s*,\s*([0-9.]+)\s+([0-9]+)\s*/))

但我没有得到id 部分。只需type=high

感谢任何帮助。

编辑:我看到我只会得到最后一个捕获组。但问题中没有说明,我需要在字符串中的那个点有动态数量的字段。我想知道是否有其他方法可以做到这一点。

【问题讨论】:

  • 如果您使用 * 或 + 量词重复捕获组,您将仅获得该组的最后一个匹配项。另见stackoverflow.com/questions/17393683
  • @horcrux 哦,我明白了。知道如何使用正则表达式获得我想要的功能吗?
  • 手动重复同一组(例如regex101.com/r/Olhe18/1)。
  • @horcrux 如果我需要它有 N 个字段怎么办?

标签: javascript regex


【解决方案1】:

您可以将所有键值对捕获在同一组中,然后将它们拆分:

const str = `test0,id=28084 type=high,18765003 138456387`;
matches = str.match(/\s*([a-zA-Z0-9\-_.]+)\s*,\s*((?:[a-zA-Z0-9\-_.]+\s*=\s*[a-zA-Z0-9\-_.]+\s*)*)\s*,\s*([0-9.]+)\s*([0-9]+)\s*/)
matches.splice.apply(matches, [2, 1].concat(matches[2].split(/\s+/)));
console.log(matches)

请注意,我在您的正则表达式中将第二组从 (...)* 更改为 ((?:...)*)

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 2013-08-05
    • 2019-05-01
    • 2013-10-18
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 2012-08-18
    相关资源
    最近更新 更多