首先 - 我已经做了一些正则表达式(无论如何都不是专家(,但这让我感到困惑。
正则表达式风味是 PCRE (PHP(
我正在尝试从 Splunk 事件中包含的某些字段中获取值。具体而言,来自 Exchange 的收件箱规则事件。
问题是这些值被封装在引号("(中。 因此,没有值的"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中捕获 这些是我正在使用的数据示例:
- from=" exceptifFrom=" hasAttachment="false" - 期望的结果= 或 "> From="即将发生的事件"
- 除了IfFrom=" - 期望的结果=即将发生的事件
- 发件人="史密斯,约翰" [SMTP:johnsmith@example.com] - 期望的结果=史密斯,约翰 from=">
- "systems"[[EX:/O=/OU=******/cn=Recipients/cn=******]" - 期望的结果=系统
提前感谢!
你可以试试这个正则表达式:
/(?<=From=""?)(?: |[^"]+)/g
它首先回顾,确保开始时有"From=",然后检查是否有空格或带引号的字符串并匹配。 如果双引号后有一个空格,则返回空匹配项,否则返回引号之间的值。编辑:
试试这个,我忘记了'?
' 量词:
b(?:From=""?(?: |([^"]+)))b
此正则表达式不使用回溯,而是在Group 1
中得到结果。
它首先将"From="
"与一个或两个引号匹配,后跟一个空格或任何数量的字符,而不是引号,抓住组 1 中的引号值。