我有以下数据:
2018-03-20 23:28:47 INFO This is an info sample(can be multiline with new line characters)
2018-03-20 23:28:47 INFO This is an info sample(can be multiline with new line characters)
2018-03-20 23:28:47 DEBUG This is a debug sample(can be multiline with new line characters) {
'x':1,
'y':2,
'z':3,
'w':4
}
2018-03-20 23:28:47 INFO This is an info sample(can be multiline with new line characters)
2018-03-20 23:28:47 DEBUG This is a debug sample(can be multiline with new line characters){
'a':5,
'b':6,
'c':7,
'd':8
}
我要提取所有DEBUG语句,为此我使用此正则表达式(\d{4}\-\d{2}\-\d{2}\ \d{2}\:\d{2}\:\d{2}\ DEBUG(.|\n|\r)*?)(?=\d{4}\-\d{2}\-\d{2}\ \d{2}\:\d{2}\:\d{2})
,但它省略了最后一个DEBUG语句。获取以下输出的正则表达式应该是什么?
2018-03-20 23:28:47 DEBUG This is a debug sample(can be multiline with new line characters) {
'x':1,
'y':2,
'z':3,
'w':4
}
2018-03-20 23:28:47 DEBUG This is a debug sample(can be multiline with new line characters){
'a':5,
'b':6,
'c':7,
'd':8
}
答案 0 :(得分:2)
我建议:
(?m)
)\Z
的最后添加替代方法来修复当前问题(与Ken在评论中建议的相同)(.|\r|\n)*?
替换效率非常低的.*?
模式并添加DOTALL修饰符(?s)
整个修复程序看起来像
(?sm)^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} DEBUG\s*(.*?)(?=[\r\n]+\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}|\Z)
请参阅regex demo。
<强>详情
(?sm)
- ^
- 开始行\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}
- 时间戳如模式DEBUG
- 文字子字符串\s*
- 0+ whitespaces (.*?)
- 第1组:任意0个字符,尽可能少,但不包括(?=[\r\n]+\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}|\Z)
- 一个积极的前瞻,需要任何一个
[\r\n]+\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}
- 一个或多个CR或LF符号,后跟时间戳,如模式|
- 或\Z
- 字符串的最后一部分答案 1 :(得分:1)
如果您确定}
的所有段落都以r"(.*DEBUG[\s\S]*?\})"
结尾,您可以使用:
DEBUG
如果{}
可能有r"(.*DEBUG.*(?!=\{|\n))(\{[\s\S]*?\})?"
,也可能没有{{1}},则以下正则表达式可以解决问题:
{{1}}