获取所有角色,直到找到新的日期/小时

时间:2015-08-14 13:25:41

标签: regex parsing multiline

我必须用正则表达式解析很多内容。 例如,内容可能是:

div
{
height: 20px;
}

我有这个正则表达式,当然会返回2个匹配项,以及我需要的组 - 数据,小时,名称,多行消息:

14-08-2015 14:18 : Example : Hello =) How are you?
What are you doing?
14-08-2015 14:19: Example2 : I'm fine thanks!

问题是如果在邮件中写入一个数字,这将不正常,因为正则表达式将停止获取更多字符。 例如,在这种情况下,这将不起作用:

(\d{2}-\d{2}-\d{4})\s?(\d{2}:\d{2})\s?:([^:]+):([^\d]+)

如何找到所有字符,直到找到新的日期/小时?

2 个答案:

答案 0 :(得分:1)

问题在于您的最终捕获组([^\d]+)

相反,您可以使用((?:(?!\d{2}-\d{2}-\d{4})[\s\S])+)

外括号:(?:(?!\ d {2} - \ d {2} - \ d {4})[\ s \ S])+ 表示捕获组

下一组括号:((? :(?!\ d {2} - \ d {2} - \ d {4})[\ s \ S] )+ )表示我们想要匹配1到无限次的非捕获组。

在内部,我们有一个负面展望:((?:(?!\ d {2} - \ d {2} - \ d {4}) [\ s \ S]) +)。这表示我们匹配的任何内容都不能包含日期。

我们实际捕获的内容:((?:(?!\ d {2} - \ d {2} - \ d {4}) [\ s \ S] )+)表示我们捕捉每个角色,包括一条新线。

有效的整个正则表达式如下:

(\d{2}-\d{2}-\d{4})\s?(\d{2}:\d{2})\s?:([^:]+):((?:(?!\d{2}-\d{2}-\d{4})[\s\S])+)

https://regex101.com/r/wH5xR2/2

答案 1 :(得分:0)

使用预测日期并完成所有事情。

/^(\d{2}-\d{2}-\d{4})\s?(\d{2}:\d{2})\s?:([^:]+):\s?((?:(?!^\d{2}-\d{2}-\d{4}\s?\d{2}:\d{2}).)*)/sm

我以两种方式编辑了你的正则表达式:

  1. 在前面添加了^,确保您只能从自己的行上的时间戳开始,这应该过滤掉发布时间戳的人的大多数问题

  2. ((?:(?!^\d{2}-\d{2}-\d{4}\s?\d{2}:\d{2}).)*)

    替换最后一个捕获组
    • (?!^\d{2}-\d{2}-\d{4}\s?\d{2}:\d{2})是一个负向前瞻,日期为
    • (?:(lookahead).)*查找任意数量的字符,后面跟着一行停靠在某行的开头。
    • ((?:(lookahead).)*)只为您抓住该群组。
  3. 效率不高,但有效。注意dotall(点匹配换行符)的s标志和m标志,让^在行首处匹配。前瞻性中需要^,以便在有人发布时间戳的情况下不停止匹配,并在开始时确保您只匹配行开头的日期。

    DEMO:https://regex101.com/r/rX8eH0/3
    正则表达式中带有标记的DEMO:https://regex101.com/r/rX8eH0/4