我有这样的文本:
:33: 88 app 2/8 superman taman, puchong 36100, Malaysia
:22: bla bla \bla /bla bla bla
:32: 45//dsfd//qdsfqsdf
:72D: Example
此示例的格式为:key:value。值可以是一行或多行。
我尝试了正则表达式 (:[0-9]{2}[A-Z]?:)(.*) 但我只得到了多行值中的第一行。当我尝试选项 Pattern.DOTALL
时,结果包含第一个键的所有文本。
正确的正则表达式应该是什么?
最佳答案
您可以使用
(?m)^(:\d{2}[A-Z]?:)(.*(?:\r?\n(?!:\d{2}[A-Z]?:).*)*)
请参阅regex demo 。不要使用Pattern.DOTALL
。
详细信息
(?m)^
- 匹配行的开头(:\d{2}[A-Z]?:)
- 第 1 组::
- 冒号\d{2}
- 2 位数字[A-Z]?
- 1 或 0 个大写 ASCII 字母:
- 冒号
(.*(?:\r?\n(?!:\d{2}[A-Z]?:).*)*)
- 第 2 组:.*
- 行的其余部分(除换行符之外的 0 个或多个字符)(?:\r?\n(?!:\d{2}[A-Z]?:).*)*
- 零个或多个序列:\r?\n(?!:\d{2}[A-Z]?:)
- 换行符(Java 8 中的\r?\n
应替换为\R
),其后面不跟随第 1 组中使用的模式.*
- 该行的其余部分
在Java中,使用
String pat = "(?m)^(:\\d{2}[A-Z]?:)(.*(?:\r?\n(?!:\\d{2}[A-Z]?:).*)*)";
参见Java demo :
String s = ":33: 88 app 2/8\nsuperman taman, puchong\n36100, Malaysia\n:22: bla bla \\bla /bla\nbla bla\n:32: 45//dsfd//qdsfqsdf\n:72D: Example";
Pattern pattern = Pattern.compile("(?m)^(:\\d{2}[A-Z]?:)(.*(?:\r?\n(?!:\\d{2}[A-Z]?:).*)*)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
System.out.println("--- NEXT PAIR ---");
System.out.println("Key:" + matcher.group(1));
System.out.println("Value:" + matcher.group(2));
}
输出:
--- NEXT PAIR ---
Key::33:
Value: 88 app 2/8
superman taman, puchong
36100, Malaysia
--- NEXT PAIR ---
Key::22:
Value: bla bla \bla /bla
bla bla
--- NEXT PAIR ---
Key::32:
Value: 45//dsfd//qdsfqsdf
--- NEXT PAIR ---
Key::72D:
Value: Example
关于java正则表达式 key : value multiple lines,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46077414/