2013-05-02 82 views
1

我一直有問題,爲特定的字符串生成正則表達式。Java的正則表達式積極lookahead

我的源字符串基本上是一組鍵值對。我期望的輸出是 下面是一個簡單的字符串:

:27B:Hello: World! 
    Something 
    World: Hello 
:29A:Test 
:30:Something isn't right-} 

所需的輸出:

Key: 27B Value: Hello: World! 
    Something 
    World: Hello 
Key: 29A Value: Test 
Key: 30 Value: Something isn't right 

這裏是我的正則表達式爲它至今:

(\\d+\\w?):([\\w\\d\\s'/,:\\Q.()\\E]+(?=(:\\s*\\d+\\w?:|\\-\\}))) 

的問題是,我似乎在捕捉整個消息。

e.g. Key: 27B Value:Hello: World! 
     Something 
     World: Hello 
    :29A:Test 
    :30:Something isn't right 

我的正則表達式應該是什麼,以便我可以提取這些鍵/值對?

+0

目前還不清楚什麼是允許的以及您的密鑰和值中不允許的內容。我不認爲有'!'匹配您當前正則表達式的值部分。 – nhahtdh 2013-05-02 14:50:45

+0

您是否試圖捕獲鍵和值或打印所需的輸出示例中所述的字符串?知道你如何使用正則表達式也是有用的。 'Pattern' +'Matcher.find()'? – rvalvik 2013-05-02 14:57:30

回答

3

+是貪婪的,所以[\\w\\d\\s'/,:\\Q.()\\E]+將捕獲的所有字符在該最後點可以匹配前瞻的字符串。要僅抓取第一個這樣的點,您需要使用「不情願」版本+?來代替。

+0

謝謝!這就像一個魅力! – Robbie 2013-05-03 11:14:08

1

你可以嘗試這樣的事:

Pattern p = Pattern.compile(":(\\d+\\w?):((?:[^:-]|:(?!\\d+\\w?:)|-(?!\\}))+)(?:-}[\\S\\s]*)?"); 
Matcher m = p.matcher(s); 
while (m.find()) 
    System.out.print("Key: " + m.group(1) + " Value: " + m.group(2)); 

製作您所需的輸出。最後一個可選組將消耗-}及其後的任何內容。基本上找到密鑰,然後消耗所有字符,直到它碰到另一個密鑰。

編輯:
如果你想要的東西更真實到你原來的正則表達式,你可以使用:

Pattern p = Pattern.compile("(\\d+\\w?):(.+?(?=(:\\s*\\d+\\w?:|\\-\\})))",Pattern.DOTALL);