2014-10-03 290 views
0

我刚刚学习使用正则表达式,它看起来有点复杂。正则表达式获取括号之间的字符串

我试图解析字符串中的Java:

new Array(new Array('1','Hello'),new Array('2','World (New) Again'),new Array('3','Now')); 

我所要的输出最终成为这些比赛:

'1','Hello' 
'2','World (New) Again' 
'3','Now' 

我尝试了一些模式,但尽我所能得到的是我得到:

'1','Hello' 
'2','World (New 
) Again' 
'3','Now' 

这是我的代码:

Pattern pattern2 = Pattern.compile("([^\\(]*[']*['][^\\)]*[']*)"); 
s = "new Array(new Array('1','Hello'),new Array('2','World (New) Again'),new Array('3','Now'));"; 
Matcher matcher = pattern2.matcher(s); 

while(matcher.find()){ 
    String match = matcher.group(1); 
    System.out.println(match); 
} 
+1

对于语法分析,正则表达式是不是最好的工具。你的情况可能是可行的,但非常脆弱。你应该实现你自己的解析器。 – Mena 2014-10-03 12:38:27

+1

“我尝试了一些模式,”你试过什么?并且您正在尝试计算哪些正则表达式不适合的平衡圆括号。正如@Mena所说,以某种方式解析字符串 – 2014-10-03 12:38:28

回答

1

如果json字符串格式如上所示,下面的代码将工作。

String s = "new Array(new Array('1','Hello'),new Array('2','World (New) Again'),new Array('3','Now'));"; 
Pattern regex = Pattern.compile("[(,]new\\sArray\\(((?:(?!\\),new\\sArray|\\)+;).)*)\\)"); 
Matcher matcher = regex.matcher(s); 
while(matcher.find()){ 
     System.out.println(matcher.group(1)); 
} 

输出:

'1','Hello' 
'2','World (New) Again' 
'3','Now' 

DEMO

+0

。谢谢。我也知道,如果逗号之间有多个空格,这可能不起作用。 – fngaserin 2014-10-03 13:05:16

+0

然后在里面加上'\ s *'。如果您仍然无法弄清楚,请提供一个示例字符串。我会尝试。 – 2014-10-03 13:07:54

0

您需要拆分并确保有关闭/开启对之间没有密切的括号:

你可以做整个事情在同一行:

String[] parts = str.replaceAll("^(new Array\\()*|\\)*;$", "").split("\\)[^)]*?Array\\("); 

一些测试代码:

String str = "new Array(new Array('1','Hello'),new Array('2','World (New) Again'),new Array('3','Now'));"; 
String[] parts = str.replaceAll("^(new Array\\()*|\\)*;$", "").split("\\)[^)]*?Array\\("); 
for (String part : parts) 
    System.out.println(part); 

输出:

'1','Hello' 
'2','World (New) Again' 
'3','Now' 
+0

但是,我无法去掉引号中的打开/关闭括号。 – fngaserin 2014-10-03 13:00:56

+0

@fnga嗯,它现在有效。虽然这有点怪物。这个工作,Avinash, – Bohemian 2014-10-03 20:42:28

相关问题