Regex для возврата только строки между фигурными скобками на последнем уровне - PullRequest
0 голосов
/ 07 декабря 2018

У меня возвращается JSON:

    {
      "status": 1,
      "message": "1",
      "data": {
        "file": "1.png"
      },
      "html": "",
      "redirect_to": ""
    }
<divid="UMS_TOOLTIP"style="position: absolute; cursor: pointer; z-index: 2147483647; background: transparent; top: -100000px; left: -100000px;"></div>

Я хочу очистить, возвращая только содержимое

{"status":1,"message":"1","data":{"file":"1.png"},"html":"","redirect_to":""}

Я пытался \{\{([^}]*)\}\}, но это не похожеработать в моих тестах.Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Одним из вариантов будет использование XRegExp для рекурсивного сопоставления вложенных { и } с, пока они не будут сбалансированы:

const input = `{"status":1,"message":"1","data":{"file":"1.png"},"html":"","redirect_to":""}<div id="UMS_TOOLTIP" style="position: absolute; cursor: pointer; z-index: 2147483647; background: transparent; top: -100000px; left: -100000px;"></div>`;
const json = '{' + XRegExp.matchRecursive(input, '{', '}') + '}';
// second parameter is the left recursive delimiter
// third parameter is the right recursive delimiter
console.log(JSON.parse(json));
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.2.0/xregexp-all.min.js"></script>
0 голосов
/ 07 декабря 2018

Предполагается, что ваш JSON возвращает следующее:

{
    "status":1,
    "message":"1",
    "data":{"file":"1.png"},
    "html":"",
    "redirect_to":""
}
<div id="UMS_TOOLTIP" style="position: absolute; cursor: pointer; z-index: 2147483647; 
background: transparent; top: -100000px; left: -100000px;"></div>

Все дали очень проницательные ответы.Но если это не очень важный шаг в вашей программе, вы можете реализовать это:

var result = `{"status":1,"message":"1","data":{"file":"1.png"},"html":"","redirect_to":""}<div id="UMS_TOOLTIP" style="position: absolute; cursor: pointer; z-index: 2147483647; background: transparent; top: -100000px; left: -100000px;"></div>`;
var retur = result.match('<');
console.log(result.slice(0, retur.index));

Чтобы ваш журнал был таким:

{
    "status":1,
    "message":"1",
    "data":{"file":"1.png"},
    "html":"",
    "redirect_to":""
}

PS: Это неРекомендуемый патч, но это просто тривиальный способ выполнить работу.

0 голосов
/ 07 декабря 2018

Вы можете попытаться создать группу следующим образом:

  • Начинается с {
  • Может иметь что угодно .*
  • Заканчивается на }
  • И не следует за любыми закрывающими скобками, используя (?!})

Примечание: Это не будет работать должным образом, если у вас есть много строковых объектов вместе с разметкой.Например.{...}<div>...</div>{...} В таких случаях это не удастся.

var regex = /({.*}(?!}))/;
var str = '{"status":1,"message":"1","data":{"file":"1.png"},"html":"","redirect_to":""}<div id="UMS_TOOLTIP" style="position: absolute; cursor: pointer; z-index: 2147483647; background: transparent; top: -100000px; left: -100000px;"></div>';

console.log(str.match(regex)[0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...