提取两个正则表达式之间的字符串
我有一个字符串(日志文件),我想提取两个字符串(多个实例)之间的所有文本。提取两个正则表达式之间的字符串
这是文字,我有:
++ 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)(.*)[+][+]
我认为最好的方法是找到所有Demand: ...
行。
你可以用下面的正则表达式做到这一点:
(?m)Demand:\s+.*$
此正则表达式查找你想要的类型的一行。您需要使用您使用的任何语言/库中的函数来搜索文本中与该正则表达式匹配的所有字符串。
(?m)
在开头设置m
选项,它代表多行,以便$
将匹配行的末尾而不是整个txt的末尾。
之后,正则表达式非常简单。它搜索Demmand:
,然后至少有一个空格,然后搜索所有内容,直到行尾。默认情况下,正则表达式不会扩展.
跨行搜索,因此仅限于它扫描的行。但是如果它扩大了(就像在前面的圆括号内使用s
一样),你将不得不更新正则表达式到(?m)Demand:\s+.*?$
--即添加?
符号来进行搜索,直到行结束为止不贪心。
不错!你明白我想达到的目标!谢谢! – Silagy
不客气。我喜欢正则表达式... :-) –
你的例子是基于行的,所以从我的观点来看,最好的解决办法是分析和比较线 - 没有魔法与正则表达式。
如果你想用正则表达式解决这个问题,首先尝试找到锚点。我推定==
将是一个好的开始,并且++
结束。之间的这些锚使用非贪婪(不是问号)DOTALL:
==\s(.*?)\+\+
(使用模式DOTALL,这将是跟随在你的网上例子)
然后将解压后的第一个子匹配组,这是你想要的文字。
试试这个:'/(Demand。*?\ d {2} \ n)/ g' – sideroxylon
这适用于我在问题中给出的在线示例,但它不适用于此站点,为什么? http:// regexstorm。网络/测试仪 – Silagy
不知道 - 但它的工作[这里](https://regex101.com/r/bF9tX0/1) – sideroxylon