正则表达式只返回最后一级大括号之间的字符串

时间:2018-12-07 05:13:57

标签: javascript jquery json regex

我有一个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":""}

我尝试了\{\{([^}]*)\}\},但在我的测试中似乎不起作用。 我在做什么错了?

4 个答案:

答案 0 :(得分:3)

您可以尝试通过以下方式创建组:

  • {开头
  • 可以有任何.*
  • }结尾
  • 并且不使用(?!})

注意:如果您有许多带有标记的字符串化对象,则此方法将无法正常工作。例如。 {...}<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])

答案 1 :(得分:2)

一种选择是使用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>

答案 2 :(得分:1)

导致问题(因为不是JSON)的不必要的附加<div id="UMS_TOOLTIP" ...>可能 与您的代码无关。

我们的一位客户经历了此事,并确认他们正在运行趋势科技防病毒安全软件,该软件与针对同一问题的类似报告保持一致:

答案 3 :(得分:0)

假设您的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:这不是推荐的补丁,只是完成工作的一种简单方法。