2016-08-24 92 views
0

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

这是文字,我有:

++ 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

+0

试试这个:'/(Demand。*?\ d {2} \ n)/ g' – sideroxylon

+0

这适用于我在问题中给出的在线示例,但它不适用于此站点,为什么? http:// regexstorm。网络/测试仪 – Silagy

+0

不知道 - 但它的工作[这里](https://regex101.com/r/bF9tX0/1) – sideroxylon

回答

1

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

你可以用下面的正则表达式做到这一点:

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

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

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

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

+0

不错!你明白我想达到的目标!谢谢! – Silagy

+1

不客气。我喜欢正则表达式... :-) –

0

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

如果你想用正则表达式解决这个问题,首先尝试找到锚点。我推定==将是一个好的开始,并且++结束。之间的这些锚使用非贪婪(不是问号)DOTALL:

==\s(.*?)\+\+(使用模式DOTALL,这将是跟随在你的网上例子)

然后将解压后的第一个子匹配组,这是你想要的文字。

相关问题