Java正则表达式积极前瞻

时间:2013-05-02 14:27:02

标签: java regex

我在为特定字符串生成正则表达式时遇到了问题。

我的源字符串基本上是一组键值对。我想要的输出是 这是一个示例字符串:

: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

我的正则表达式应该是什么,以便我可以提取这些键/值对?

2 个答案:

答案 0 :(得分:3)

+非常贪婪,因此[\\w\\d\\s'/,:\\Q.()\\E]+会捕获前瞻可以匹配的字符串中 last 点之前的所有字符。要仅获取第一个这一点,您需要使用“不情愿”版本+?

答案 1 :(得分: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);