我在为特定字符串生成正则表达式时遇到了问题。
我的源字符串基本上是一组键值对。我想要的输出是 这是一个示例字符串:
: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 :(得分: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);