我有一个字符串,里面有多个“消息”。 “消息”以特定的字符序列开头。我试过:
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
可以在消息内部,仅它们的顺序意味着下一条消息的开始
最佳答案
p{ASCII}+
是一个或多个 ASCII 字符的贪婪正则表达式,这意味着它将使用最长的可能匹配。但如果您想要尽可能短的匹配,则可以使用不情愿量词:p{ASCII}+?
。在这种情况下,您应该使用正前瞻断言。
正则表达式可能会变成:
Pattern pattern = Pattern.compile("(?<record>ab\\p{ASCII}+?)(?=(ab)|\\z)");
请注意 (ab)|\z
以匹配最后一条消息...
关于java 正则表达式 字符序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48866168/