JAVA最长模式匹配字符串与换行符

时间:2012-11-26 21:26:58

标签: java regex pattern-matching line-breaks

如何匹配包含换行符的字符串中的模式? e.g。

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);

但没有成功。任何sugestions?

只是为了说清楚。这是我的input

1 个答案:

答案 0 :(得分:1)

单个JSON对象作为输入的问题很简单:您的第一个.*是贪婪的。所以它会消耗所有内容,直到最后{仍然跟着}。如果您将.*取消了(或将其删除),则应获取完整的JSON对象:

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

但你可以(并且应该)完全忽略开头和尾随重复:

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

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

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

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