我有一个字符串(日志文件),我想提取两个字符串(多个实例)之间的所有文本。
这是我的文字:
++ PLANNING ITERATIONS of DEMAND 337 ++
=========================================
Demand: 337 Event: 1189.001 Object/State: 7058/0 Tier: 0 Start: 1608130700 Duration: 90 At: 19-7-2016 16:19:36
Demand: 337 Event: 1190.001 Object/State: 7059/0 Tier: 0 Start: 1608130830 Duration: 330 At: 19-7-2016 16:19:36
Demand: 337 Event: 1191.001 Object/State: 7060/0 Tier: 0 Start: 1608140000 Duration: 360 At: 19-7-2016 16:19:36
++ EVENT PLAN of DEMAND 337 ++
===============================
event_time(1242.001,1,1609070800,1609071430)
event_time(1241.001,1,1609060800,1609061430)
event_time(1240.001,1,1609050800,1609051430)
++ PLANNING ITERATIONS of DEMAND 174 ++
=========================================
Demand: 174 Event: 212.001 Object/State: 6948/0 Tier: 0 Start: 1609010800 Duration: 390 At: 19-7-2016 16:19:38
Demand: 174 Event: 213.001 Object/State: 6949/0 Tier: 0 Start: 1609020800 Duration: 390 At: 19-7-2016 16:19:38
++ EVENT PLAN of DEMAND 174 ++
===============================
event_time(213.001,1,1609020800,1609021430)
event_time(212.001,1,1609010800,1609011430)
我希望得到
之间的所有东西++ PLANNING ITERATIONS of DEMAND 337 ++
=========================================
和
++ EVENT PLAN of DEMAND 174 ++
===============================
我期望得到的结果是:
Demand: 337 Event: 1189.001 Object/State: 7058/0 Tier: 0 Start: 1608130700 Duration: 90 At: 19-7-2016 16:19:36
Demand: 337 Event: 1190.001 Object/State: 7059/0 Tier: 0 Start: 1608130830 Duration: 330 At: 19-7-2016 16:19:36
Demand: 337 Event: 1191.001 Object/State: 7060/0 Tier: 0 Start: 1608140000 Duration: 360 At: 19-7-2016 16:19:36
Demand: 174 Event: 212.001 Object/State: 6948/0 Tier: 0 Start: 1609010800 Duration: 390 At: 19-7-2016 16:19:38
Demand: 174 Event: 213.001 Object/State: 6949/0 Tier: 0 Start: 1609020800 Duration: 390 At: 19-7-2016 16:19:38
我试图自己解决这个问题但是我已经达到了一定程度,但它会在第一场比赛结束时返回。
这是我使用的正则表达式:
Demand:(?s)(.*)[+][+]
答案 0 :(得分:1)
我认为最好的办法就是找到所有Demand: ...
行。
您可以使用以下正则表达式执行此操作:
(?m)Demand:\s+.*$
此正则表达式找到所需类型的一行。您需要在您使用的任何语言/库中使用该函数,以搜索与您的文本中的该正则表达式匹配的所有字符串。
开头的(?m)
设置m
选项,它代表多行,因此$
将匹配行的结尾而不是整个txt的结尾。
之后正则表达式非常简单。它会搜索Demmand:
,然后搜索至少一个空格,然后搜索所有内容,直到该行结束。默认情况下,正则表达式不会跨行扩展.
搜索,因此仅限于它扫描的行。但如果它扩展了(比如在前面的括号内也使用了选项s
),则必须将正则表达式更新为(?m)Demand:\s+.*?$
- 即添加?
符号以进行搜索直到非贪婪的结束。
答案 1 :(得分:0)
你的例子是基于行的,所以从我的观点来看,最好的解决方案是解析和比较行 - 没有魔法与正则表达式。
如果要使用正则表达式解决此问题,请首先尝试查找锚点。我认为==
是一个好的开始,++
是一个结局。在这些锚点之间使用非贪婪(不是问号)dotall:
==\s(.*?)\+\+
(使用模式DOTALL,这将是您在线示例中的尾随s)
然后提取第一个子匹配组,即您想要的文本。