java正则表达式 key : value multiple lines

标签 java regex

我有这样的文本:

: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/

相关文章:

java - 在从 Kafka 代理获取数据之前,消费者如何检查架构注册表是否可访问?

java - 在android studio的所有activity中保留账户信息

java - 通过 TCP 套接字 Java 读/写流式音频

html - 来自 10-K EDGAR 的网页抓取风险因素

c# - 正则表达式查找信用卡模式不排除超过 16 位的信用卡模式

java - Android游戏如何保存高分

java - 根据用户输入查找输入形状的面积

javascript - 选择除单点和单破折号之外的所有非数字字符

正则表达式 URL 提取斜杠

c# - 提取脚本标签的正则表达式