在模式之前匹配所有内容,包括换行和/或回车

时间:2018-08-13 21:50:48

标签: java regex

如何匹配所有内容,直到遇到特定的人群

匹配:

Group1:

abc def xyz what ever foo blah blah keep matching this and this 组2:

01 Feb 2018 blah blah blah keep matching this and this keep matching this and this

第3组: 01 Mar 2018 blah blah blah

发件人:

abc def xyz what ever foo blah blah keep matching this and this 01 Feb 2018 blah blah blah keep matching this and this keep matching this and this 01 Mar 2018 blah blah blah

匹配01 Jan 2018之前的所有内容,这里的日期是模式([0-9]{2}\s[A-Za-z]{3}\s[0-9]{4})

这似乎不起作用^((.*)(?!([0-9]{2}\s[A-Za-z]{3}\s[0-9]{4})))

2 个答案:

答案 0 :(得分:3)

您可以将此正则表达式与前瞻和DOTALL修饰符一起使用:

(?ms)(.+?(?=^\d{2}\s[A-Za-z]{3}\s\d{4}|\z))

RegEx Demo

说明:

  • (?ms):启用DOTALL修饰符,以便我们可以使用.匹配包括换行符在内的任何字符。同时启用MULTILINE模式以能够^$锚点。
  • .+?:匹配1个或多个字符,包括换行符
  • (?=^\d{2}\s[A-Za-z]{3}\s\d{4}):使用前瞻性断言确保我们提前预定日期(格式为dd-mon-yyyy

代码:

final String regex = "(?ms)(.+?(?=^\\d{2}\\s[A-Za-z]{3}\\s\\d{4}|\\z))";
final Pattern pattern = Pattern.compile( regex );
final Matcher matcher = pattern.matcher( input );

while (matcher.find()) {
    System.out.println("Match: " + matcher.group(0));
}

答案 1 :(得分:0)

我知道你现在要做什么。
为了避免复杂化,需要进行类似这样的操作。

StreamsBuilder builder = new StreamsBuilder(); builder.stream("your-input-topic") .groupBy((k,v) -> v) .count() .toStream() .to("your-output-topic");

https://regex101.com/r/xGmVGp/1

可读正则表达式

"(?s)(?=.)([0-9]{2}\\s[A-Za-z]{3}\\s[0-9]{4})?.*?(?=(?:[0-9]{2}\\s[A-Za-z]{3}\\s[0-9]{4})|\\z)"