我有这样的文字:
: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
时,结果包含第一个键的所有文本。
正确的正则表达式应该是什么?
答案 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));
}