Regex для сопоставления списка буквенно-цифровых идентификаторов фрагмента JSON внутри HTML - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь составить регулярное выражение для соответствия следующей ситуации:

В проекте 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>

Моя цель - получить первый список идентификаторов книг:

abc123
qwe456
asd789

Итак, как вы можете видеть, условия, с которыми я сейчас работаю:

  • Поиск первого "bookIds" : [ появления и остановка на следующем ]

Я получил что-то подобное с: /bookIds" : \[([\S\s]*?)\]/. Да, концептуально я думаю о поиске первой строки bookIds, начинаю после первой [ после этого и останавливаюсь до следующей ], но я не знаю, как это сделать. Теперь я получаю документацию о lookahead & lookbehinds.

  • Теперь мне нужно искать (или цикл) внутри этого совпадения и получать то, что находится внутри кавычек (я знаю, как я могу сделать это индивидуально: /"(.*?)"/)

Но, к сожалению, я часами гуглял и пробовал, и я не заставляю его работать (ни в моем проекте Node, ни в тестах, которые я пробую в regex101.com )

Любые предложения будут высоко оценены!

1 Ответ

0 голосов
/ 07 января 2019

Вы можете использовать "bookIds"\s*:\s*\[([^\]]+?)] Демо

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,''))
...