带有所需文本的正则表达式匹配字符串

时间:2018-02-21 02:06:28

标签: regex

我正在尝试从sendmail日志中进行smtp中继并使其可靠我需要在日志条目中需要多个字符串。日志文件条目的示例如下:

2018-02-20T19:35:35+00:00 mx01.example.org sendmail[12345]: v1k82343VJ8K: to=<user@foobar.com>, delay=00:00:01, xdelay=00:00:01, mailer=esmtp, tls_verify=OK, relay=mailserver1.foobar.com. [1.1.1.1], dsn=2.0.0, stat=Sent

我不能只键入“relay =”,因为我需要的特定中继名只出现在包含“to =”的日志条目行中。

如何编写我的正则表达式:

  1. 单词“sendmail”,后跟“to =”,然后是“relay =”,它们都出现在同一个日志条目中。
  2. 在“relay =”之后,我匹配任何字母,数字和字符,直到逗号。
  3. 最终结果应为:

    mailserver1.foobar.com. [1.1.1.1]
    

1 个答案:

答案 0 :(得分:1)

See regex in use here

^.*\bsendmail\b.*\bto=.*relay=\K[^,]*
  • ^在行首处断言位置
  • .*多次匹配任何字符
  • \b断言位置为单词边界
  • sendmail按字面意思匹配
  • \b断言位置为单词边界
  • .*多次匹配任何字符
  • \b断言位置为单词边界
  • to=按字面意思匹配
  • .*多次匹配任何字符
  • relay=匹配此字面
  • \K重置比赛的起点。最终匹配中不再包含任何以前消费的字符
  • [^,]*匹配除,以外的任何字符

结果:mailserver1.foobar.com. [1.1.1.1]