2012-11-26 42 views
0

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

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

但是,没有sucess。任何消化?

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

+0

“没有成功”。它失败了吗?你有错误的比赛吗?哪一个?我是否正确地假设你从“A”开始捕获所有的东西......? –

+0

@Reimeus,这是一个JSON解析器实现我想要做的 – Medeiros

+0

你总是有一个输入是这种格式?我的意思是,它总是以某个JSON对象作为参数的函数调用?在这种情况下,你不能使用子字符串? –

回答

1

与单个JSON对象的问题作为输入很简单:你的第一个.*是贪婪。所以它会消耗一切,直到最后的{,后面还有}。如果你所做的.* ungreedy(或离开它了),你应该得到充分的JSON对象:

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

但你可以(也应该)完全离开了开头和结尾重复:

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

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

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

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

+0

谢谢。我习惯于用Python进行编程,我喜欢用RE来解决问题,但在这个特定的问题中,我认为最好的解决方案就像'String sub = s.substring(s.indexOf(“{”),s.lastIndexOf “}”)+ 1);' – Medeiros

+0

@Medeiros是的,对于单个JSON对象,这可能是最好的(也是最易读的)解决方案。但是,它仍然不能解决包含JSON对象列表的文件的问题。 –