java正则表达式键:值多行

时间:2017-09-06 14:07:52

标签: java regex

我有这样的文字:

  

: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时,结果包含第一个键的所有文本。

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

1 个答案:

答案 0 :(得分:1)

您可以使用

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<div id="myDiv">
  <select id="mySelect">
    <option>1</option>
    <option>2</option>
    <option>3</option>
  </select>
  <input id="myInput" value="">
</div>

请参阅regex demo使用(?m)^(:\d{2}[A-Z]?:)(.*(?:\r?\n(?!:\d{2}[A-Z]?:).*)*)

<强>详情

  • Pattern.DOTALL - 匹配行的开头
  • (?m)^ - 第1组:
    • (:\d{2}[A-Z]?:) - 冒号
    • : - 2位数
    • \d{2} - 1或0个大写ASCII字母
    • [A-Z]? - 冒号
  • : - 第2组:
    • (.*(?:\r?\n(?!:\d{2}[A-Z]?:).*)*) - 该行的其余部分(除了换行符之外的0个或更多个字符)
    • .* - 零个或多个序列:
      • (?:\r?\n(?!:\d{2}[A-Z]?:).*)* - 换行符(Java 8中的\r?\n(?!:\d{2}[A-Z]?:)应替换为\r?\n),但未遵循第1组中使用的模式
      • \R - 其余部分

在Java中,使用

.*

请参阅Java demo

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

输出:

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)); 
}