2013-05-02 85 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);