0

如何匹配具有换行符的字符串中的模式?例如

requisition({"title":"my json",
             "items" : [{ "A": "a",
                          "B": "b"}
                       ]
            })

我只想抓住这个

{"title":"my json",
             "items" : [{ "A": "a",
                          "B": "b"}
                       ]
}

我尝试了类似的东西

String pattern = ".*(\\{.*\\}).*";
Pattern r = Pattern.compile(pattern, Pattern.DOTALL);

但没有成功。有什么建议吗?

只是为了更清楚。这是我的输入

4

1 回答 1

1

将单个 JSON 对象作为输入的问题很简单:您的第一个.*是贪婪的。所以它会消耗所有东西,直到最后一个{仍然跟着 a }。如果你不.*贪心(或忽略它),你应该得到完整的 JSON 对象:

String pattern = ".*?(\\{.*\\}).*";

但是您可以(并且应该)完全省略开头和结尾的重复:

String pattern = "\\{.*\\}";

然后你甚至不需要捕捉任何东西。请注意,这必须与find而不是一起使用matches

但是,您的输入有多个 JSON 对象。这就是您遇到正则表达式问题的地方。一些引擎支持允许正确嵌套括号的结构(检查哪些实际上属于一起)。但是这些正则表达式很容易变得丑陋且不可维护。

你最好手动遍历字符串,并保持当前嵌套级别的计数。每当您回到顶层时,您只需切断一个子字符串(从相应的左括号到您当前的位置)。

于 2012-11-26T21:46:45.007 回答