我有一个包含多个“消息”的字符串。 “message”以某些char序列开头。我试过了:
String str = 'ab message1ab message2ab message3'
Pattern pattern = Pattern.compile('(?<record>ab\\p{ASCII}+(?!ab))');
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
handleMessage(matcher.group('record'))
}
但\p{ASCII}+
贪吃一切。
符号a
,b
只能在消息内,其序列意味着下一条消息的开头
答案 0 :(得分:2)
p{ASCII}+
是一个或多个ASCII字符的 greedy 正则表达式,这意味着它将使用尽可能长的匹配。但是如果您想要尽可能短的匹配,则可以使用不情愿的量词:p{ASCII}+?
。在这种情况下,您应该使用正面前瞻断言。
正则表达式可以成为:
Pattern pattern = Pattern.compile("(?<record>ab\\p{ASCII}+?)(?=(ab)|\\z)");
请注意(ab)|\z
以匹配上一条消息...