使用双引号组合在正则表达式中捕获数据

Capturing data in regex with a combination of double quotes

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

正则表达式风格是 pcre (php)

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

要注意的是,这些值被封装在引号 (") 中。因此,没有值的 "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=******]".
The事件中的下一个字段是 ExceptFrom=""。

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

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

这种方法可行,但有很多问题我必须在稍后的过程中过滤掉。此外,当数据看起来像 From="" 时,它会捕获 ExceptFrom="".

的下一个字段

你能帮我找出一个正则表达式,如果有双引号,它会获取内部引号集之间的值,如果有单引号,则获取引号之间的值,而不是 return 一个值,如果只有一组双引号 ("")。
最后一个是可有可无的,因为我稍后可以忽略它,但它会使数据看起来更好。

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

  1. From="" ExceptIfFrom="" HasAttachment="False" - 期望的结果=或""
  2. From="Upcoming Events" ExceptIfFrom="" - 期望的结果=即将发生的事件
  3. From=""Smith, John" [SMTP:johnsmith@example.com] - 期望的结果=Smith, John
  4. From=""Systems"[[EX:/O=/OU=******/cn=Recipients/cn=******]" - 期望的结果=系统

提前致谢!

你可以试试这个正则表达式:

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

它首先回头看,确保开始时有 'From="',然后检查是否有 Space 或带引号的字符串并匹配它们。 如果双引号后有 Space,则 returns 为空匹配,否则 returns 引号之间的值。 编辑:

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

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

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

它首先将“From="”与一个或两个引号匹配,然后是 Space 或任何数量的字符(不是引号),在第 1 组中获取引号值。