java正则表达式键:值多行

java正则表达式键:值多行,java,regex,Java,Regex,我有这样的文本: :33:88 app 2/8马来西亚浦中36100超人塔曼 :22:bla-bla\bla/bla-bla-bla :32:45//dsfd//qdsfqsdf :72D:示例 此示例有一个表单:key:value。值可以在一行或多行上 我尝试了regex(:[0-9]{2}[A-Z]?:)(.*),但我只得到了多行值中的第一行。当我尝试选项Pattern.DOTALL时,结果包含第一个键的所有文本 什么是正确的正则表达式?您可以使用 (?m)^(:\d{2}[A-Z]?:)(

我有这样的文本:

:33:88 app 2/8马来西亚浦中36100超人塔曼

:22:bla-bla\bla/bla-bla-bla

:32:45//dsfd//qdsfqsdf

:72D:示例

此示例有一个表单:key:value。值可以在一行或多行上

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

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

您可以使用

(?m)^(:\d{2}[A-Z]?:)(.*(?:\r?\n(?!:\d{2}[A-Z]?:).*)*)
看。不要使用
模式.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]?:)
        -换行符(
        \r?\n
        在Java 8中应替换为
        \r
        )与组1中使用的模式不符
      • *
        -行的其余部分
在Java中,使用

String pat = "(?m)^(:\\d{2}[A-Z]?:)(.*(?:\r?\n(?!:\\d{2}[A-Z]?:).*)*)";
见:

输出:

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

Pattern.MULTILINE
修饰符一起使用。感谢您的快速回答。完美地工作
--- 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