我必须用正则表达式解析很多内容。 例如,内容可能是:
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]+)
如何找到所有字符,直到找到新的日期/小时?
答案 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])+)
答案 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
我以两种方式编辑了你的正则表达式:
在前面添加了^
,确保您只能从自己的行上的时间戳开始,这应该过滤掉发布时间戳的人的大多数问题
用((?:(?!^\d{2}-\d{2}-\d{4}\s?\d{2}:\d{2}).)*)
(?!^\d{2}-\d{2}-\d{4}\s?\d{2}:\d{2})
是一个负向前瞻,日期为(?:(lookahead).)*
查找任意数量的字符,后面跟着一行停靠在某行的开头。((?:(lookahead).)*)
只为您抓住该群组。效率不高,但有效。注意dotall(点匹配换行符)的s
标志和m
标志,让^
在行首处匹配。前瞻性中需要^
,以便在有人发布时间戳的情况下不停止匹配,并在开始时确保您只匹配行开头的日期。
DEMO:https://regex101.com/r/rX8eH0/3
正则表达式中带有标记的DEMO:https://regex101.com/r/rX8eH0/4