你可以使用
(?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