结合使用双引号来捕获正则表达式中的数据

时间:2018-09-26 14:49:15

标签: regex pcre regex-group

首先,我做了一些正则表达式(无论如何都不是专家),但这让我很沮丧。

regex风味为pcre(php)

我正在尝试从Splunk事件中包含的某些字段中获取值。具体来说,来自交换的收件箱规则事件。

捕获到的是将值封装在quotes(“)中。因此,一个没有值的“ From”字段看起来像:
From="". One with an actual value would look like From=""Smith, John" [SMTP:johnsmith@example.com] or From="Microsoft At Home" or From=""Systems"[[EX:/O=<organization>/OU=******/cn=Recipients/cn=******]".
事件中的下一个字段是ExceptFrom =“”。

我有一个正则表达式模式:

`(?:\bFrom=(?:")(?:"|(?:))(?P<From_fixed>((.+?))|((.+?)))(?:"))` 

这种类型的作品,但是有很多问题,我稍后必须在此过程中过滤掉。另外,当数据看起来像From =“”时,它将捕获ExceptFrom =“”的下一个字段。

您能帮我找出一个正则表达式吗,如果有双引号,则得到内部引号之间的值;如果有单引号,则得到引号之间的值;如果只有一组引号,则不返回值双引号(“”)。
最后一个是一个不错的选择,因为我以后可以忽略它,但这会使数据看起来更好。

这些应捕获在命名组From_fixed中 这些是我正在使用的数据的示例:

  1. From =“” ExceptIfFrom =“” HasAttachment =“ False”-所需的结果=或“”
  2. From =“即将发生的事件” ExceptIfFrom =“”-期望的结果=即将发生的事件
  3. From =“”史密斯,约翰“ [SMTP:johnsmith@example.com]-所需结果=史密斯,约翰
  4. From =“”系统“ [[EX:/ O = / OU = ****** / cn =收件人/ cn = ******]”-所需的结果=系统

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以尝试以下正则表达式:

/(?<=From=\"\"?)(?: |[^"]+)/g

首先回头,确保开始处有“ From =“”,然后检查是否有空格或带引号的字符串并将其匹配。 如果双引号后有空格,则返回空匹配项,否则返回引号之间的值。 编辑

相反,我忘记了“ ?”这个量词:

\b(?:From=""?(?: |([^"]+)))\b

此正则表达式不使用回溯,而是在Group 1中得到结果。

首先将“ From="”与一两个引号匹配,然后将一个空格或任意数量的字符(而不是引号)匹配起来,将组1中的引号值进行匹配。