2014-10-03 238 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

相關問題