如何匹配具有换行符的字符串中的模式? 例如
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);
但是没有成功。有什么建议吗?
只是为了说得更清楚。这是我的input
最佳答案
使用单个 JSON 对象作为输入的问题很简单:您的第一个 .*
是贪婪的。因此它会消耗所有内容,直到最后一个 {
后面仍然跟着 }
。如果您使 .*
变得不贪婪(或将其遗漏),您应该获得完整的 JSON 对象:
String pattern = ".*?(\\{.*\\}).*";
但是您可以(并且应该)完全省略开头和结尾的重复:
String pattern = "\\{.*\\}";
那么您甚至不需要捕获任何东西。请注意,这必须与 find
一起使用,而不是与 matches
一起使用。
但是,您的输入有多个 JSON 对象。这就是正则表达式出现问题的地方。某些引擎支持允许正确嵌套括号的结构(以检查哪些括号实际上属于一起)。但这些正则表达式很容易变得丑陋且不可维护。
您最好手动遍历字符串,并记录当前的嵌套级别。每当您返回顶层时,您只需切断一个子字符串(从相应的左括号到当前位置)。
关于JAVA 字符串中带换行符的最长模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13573432/