1

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

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

: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

我的正则表达式应该是什么才能提取这些键/值对?

4

2 回答 2

3

+是贪婪的,因此[\\w\\d\\s'/,:\\Q.()\\E]+将捕获直到前瞻可以匹配的字符串中最后一个点的所有字符。要仅抓住第一个这样的点,您需要改用“不情愿”版本+?

于 2013-05-02T15:18:38.397 回答
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);
于 2013-05-02T14:41:46.247 回答