2012-10-23 18 views
2

我有一個這樣的字符串:obj[attr1=val1 attr2=val2 attr3=val3]
我需要提取對象的名稱和屬性。java正則表達式:組計數固定

/^(\w+)(?:\[(\w+=\w+)(?:\s(\w+=\w+))*\])?$/ 

現在我有一個難以決定在Java中:

Pattern pathPattern = Pattern.compile("^(\\w+)(?:\\[(\\w+=\\w+)(?:\\s+(\\w+=\\w+))*\\])?$"); 

我得到只是一個對象名稱和

此前,我一直在使用正則表達式旁邊類似決定任務在javascript第一屬性。 Mather類似乎沒有考慮符號「*」而獲得對應於「()」計數的組計數。

是否存在使工作java reg exp像js regexp的可能性,或者我需要進行兩步提取?

謝謝

+0

是的你是對的。它不考慮所有與'*'匹配的東西。但只有一組人數。 –

+0

我認爲這是奇怪的實現方式。我可以使用reg exp進行匹配,但我無法使用數據。 – Damask

+0

當你使用'*'時,模式將會被下一場比賽不斷取代。因此最後你只會有一個匹配的字符串。這就是爲什麼它只有一個組。 –

回答

4

Matcher.groupCount()只計算開放括號的數量,並認爲他們是一夥的。所以,你打開的括號數將是組數的數量(假設你沒有使用任何非捕獲組)。

您可以使用以下方式獲得[.*]內的值: -

Pattern pattern = Pattern.compile("(?:\\b)(\\w+?)=(\\w+?)(?:\\b)"); 
Matcher matcher = pattern.matcher(str); 

while (matcher.find()) { 
    System.out.println(matcher.group(1) + " : " + matcher.group(2)); 
} 

這將匹配所有attr=val對的[]內。

輸出: -

attr1 : val1 
attr2 : val2 
attr3 : val3 

更新: -

因爲你沒有做你上面的字符串的邊界檢查,上面的圖案,甚至可以簡化爲: -

Pattern pattern = Pattern.compile("(\\w+?)=(\\w+)"); 
+0

這種方式假設兩步決定。我很有興趣一步到位。看起來像在Java RegExp中是不可能的。 – Damask

+0

@BulatSafin。 2步決定的意義在哪?我無法理解。 –

+0

首先:提取對象名稱和括號內容。第二:解析括號內容。 – Damask