【问题标题】:java regex key: value multiple linesjava正则表达式键:值多行
【发布时间】:2017-09-06 14:07:52
【问题描述】:

我有这样的文字:

:33: 88 app 2/8 superman taman, puchong 36100, Malaysia

:22: bla bla \bla /bla bla bla

:32: 45//dsfd//qdsfqsdf

:72D: 示例

此示例具有 :key:value 格式。值可以是单行或多行。

我尝试了正则表达式 (:[0-9]{2}[A-Z]?:)(.*) 但我只得到了多行值的第一行。当我尝试选项Pattern.DOTALL 时,结果包含第一个键的所有文本。

正确的正则表达式应该是什么?

【问题讨论】:

标签: java regex


【解决方案1】:

你可以使用

(?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

【讨论】:

  • 感谢您的快速回答。完美运行
猜你喜欢
  • 2011-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
相关资源
最近更新 更多