在两个Regex表达式之间提取字符串

时间:2016-08-24 06:01:02

标签: regex

我有一个字符串(日志文件),我想提取两个字符串(多个实例)之间的所有文本。

这是我的文字:

++ 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)(.*)[+][+]

Online Example

2 个答案:

答案 0 :(得分:1)

我认为最好的办法就是找到所有Demand: ...行。

您可以使用以下正则表达式执行此操作:

(?m)Demand:\s+.*$

此正则表达式找到所需类型的一行。您需要在您使用的任何语言/库中使用该函数,以搜索与您的文本中的该正则表达式匹配的所有字符串。

开头的(?m)设置m选项,它代表多行,因此$将匹配行的结尾而不是整个txt的结尾。

之后正则表达式非常简单。它会搜索Demmand:,然后搜索至少一个空格,然后搜索所有内容,直到该行结束。默认情况下,正则表达式不会跨行扩展.搜索,因此仅限于它扫描的行。但如果它扩展了(比如在前面的括号内也使用了选项s),则必须将正则表达式更新为(?m)Demand:\s+.*?$ - 即添加?符号以进行搜索直到非贪婪的结束。

答案 1 :(得分:0)

你的例子是基于行的,所以从我的观点来看,最好的解决方案是解析和比较行 - 没有魔法与正则表达式。

如果要使用正则表达式解决此问题,请首先尝试查找锚点。我认为==是一个好的开始,++是一个结局。在这些锚点之间使用非贪婪(不是问号)dotall:

==\s(.*?)\+\+(使用模式DOTALL,这将是您在线示例中的尾随s)

然后提取第一个子匹配组,即您想要的文本。