【问题标题】:Extracting strings between two Regex expression提取两个正则表达式之间的字符串
【发布时间】:2016-08-24 06:01:01
【问题描述】:

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

这是我的文字:

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

【问题讨论】:

  • 试试这个:/(Demand.*?\d{2}\n)/g
  • 这适用于我在问题中给出的在线示例,但在本网站中不起作用,这是为什么呢? regexstorm.net/tester
  • 不确定 - 但它有效here

标签: regex


【解决方案1】:

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

您可以使用以下正则表达式来做到这一点:

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

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

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

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

【讨论】:

  • 不错!你明白我想要达到的目标!谢谢!
【解决方案2】:

您的示例是基于行的,所以从我的角度来看,最好的解决方案是解析和比较行 - 正则表达式没有魔法。

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

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

然后提取第一个子匹配组,就是你要的文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2017-04-15
    • 1970-01-01
    相关资源
    最近更新 更多