![](/img/trans.png)
[英]Regex with multiple matches: pattern should delimit old and start new match
[英]Regex start new match at specific pattern
你好,我对正则表达式有点陌生,有一个小问题,也许很简单。
我有给定的文字:
17.11.2020 15:32 typical Pat. seems sleeping
Additional test
17.11.2020 15:32 typical Pat. seems sleeping
Additional test
17.11.2020 15:32 typical Pat. seems sleeping
Additional test
我当前的正则表达式(\d{2}.\d{2}.\d{4}\s\d{2}:\d{2})\s?(.*)
只匹配到睡眠,但产生 3 个匹配正确。 但我也需要第二组中的Additional test
文本。 我尝试了类似(\d{2}.\d{2}.\d{4}\s\d{2}:\d{2})\s?([,.:\w\s]*)
但现在我只有一场大型比赛,因为第二组将一切都拿走直到最后。
我如何匹配所有内容,直到开始有日期的新行并从那里创建新匹配?
如果您确定只有一条附加线要匹配,您可以使用
(?m)^(\d{2}\.\d{2}\.\d{4}\s\d{2}:\d{2})\s*(.*(?:\n.*)?)
请参阅正则表达式演示。 细节:
(?m)
- 多行修饰符^
- 行首(\d{2}\.\d{2}\.\d{4}\s\d{2}:\d{2})
- 组 1:日期时间字符串\s*
- 零个或多个空格(.*(?:\n.*)?)
- 第 2 组:除换行符之外的任何零个或多个字符 尽可能多的字符,然后是可选行,换行符后跟除换行符之外的任何零个或多个字符尽可能多的字符。如果可以有任意数量的行,您可以考虑
(?m)^(\d{2}\.\d{2}\.\d{4}[\p{Zs}\t]\d{2}:\d{2})[\p{Zs}\t]*(?s)(.*?)(?=\n\d{2}\.\d{2}\.\d{4}|\z)
请参阅此正则表达式演示。 这里,
(?m)^(\d{2}\.\d{2}\.\d{4}[\p{Zs}\t]\d{2}:\d{2})
- 匹配相同如上,只是\s
被替换为仅匹配水平空白的[\p{Zs}\t]
[\p{Zs}\t]*
- 0+ 个水平空白字符(?s)
- 现在, .
将匹配任何字符,包括换行符(.*?)
- 第 2 组:任何零个或多个字符,尽可能少(?=\n\d{2}\.\d{2}\.\d{4}|\z)
- 直到最左边出现的换行符,后跟日期字符串,或直到结尾细绳。您正在使用\s
重复使用带有字符 class [,.:\w\s]*
的*
量词,并且\s
也匹配换行符并且匹配太多。
您可以使用不匹配换行符的(.*\r?\n.*)
匹配行的 rest ,然后匹配同一组中的换行符和下一行。
^(\d{2}.\d{2}.\d{4}\s\d{2}:\d{2})\s?(.*\r?\n.*)
如果可以跟随多行,则匹配以下所有不以类似日期的模式开头的行。
^(\d{2}\.\d{2}\.\d{4})\s*(.*(?:\r?\n(?!\d{2}\.\d{2}\.\d{4}).*)*)
解释
^
字符串的开头(
捕获组 1\d{2}\.\d{2}\.\d{4}
匹配类似日期的模式)
关闭第 1 组\s*
匹配 0+ 个空白字符(或匹配没有换行符的空白字符[^\S\r\n]*
)(
捕获组 2
.*
匹配整行(?:\r?\n(?.\d{2}\.\d{2}\.\d{4}).*)*
如果整行不以日期开头,则可选择重复匹配整行图案)
关闭第 2 组
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.