正则表达式以匹配HTML内JSON片段的字母数字ID列表

时间:2019-01-07 17:47:24

标签: node.js regex regex-lookarounds regex-group regex-greedy

我正在尝试编写正则表达式以匹配以下情况:

在Node.js项目中,我有一个多行字符串,其中包含一个大型HTML代码以及一些具有以下结构的JS:

<html>
  <head>
  </head>
  <body>
    <script type="text/javascript">
      ... more code ...
      },
      "bookIds" : [
        "abc123",
        "qwe456",
        "asd789"
      ],
      ... more code, and in another json:
      },
      "bookIds" : [
        "foo111",
        "bar222",
        "baz333"
      ],
      ... more code ...
    </script>
  </body>
</html>

我的目标是获得第一个bookIds列表:

abc123
qwe456
asd789

因此,正如您所看到的,我目前正在使用的条件是:

  • 搜索第一个"bookIds" : [出现并停在下一个]

我得到了类似的东西:/bookIds" : \[([\S\s]*?)\]/。是的,从概念上讲,我虽然要查找第一个字符串bookIds,然后在之后的第一个[之后开始,然后在下一个]之前停止,但是我不知道该怎么做。我现在正在记录有关超前和后退的记录。

  • 现在我需要搜索(或循环)该匹配项并获取引号内的内容(我知道我该怎么做:/"(.*?)"/

但是不幸的是,我已经花了数小时来进行谷歌搜索和尝试,但并没有使它正常工作(无论是在Node项目中还是在regex101.com中尝试的测试中)

任何建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

您可以使用"bookIds"\s*:\s*\[([^\]]+?)] Demo

let str = `<html>
  <head>
  </head>
  <body>
    <script type="text/javascript">
      "bookIds" : [
        "abc123",
        "qwe456",
        "asd789"
      ],
      "bookIds" : [
        "foo111",
        "bar222",
        "baz333"
      ],
    <\/script>
  <\/body>
<\/html>`

let op = str.match(/"bookIds"\s*:\s*\[([^\]]+?)]/m)
console.log(op[1].replace(/[\s"]+/g,''))