【问题标题】:RegEx : hardcoded capturing group valueRegEx:硬编码捕获组值
【发布时间】:2015-10-01 14:39:00
【问题描述】:

我正在尝试为我的流利服务器编写自己的 RegEx。 这是我的正则表达式:

^(?<server>)\[(?<time>[^\]]*)\] (.*) \[(?<filename>[^\]]*)\:(?<line>[^\]]*)\](.*) To: (?<to>((?!\ \-\- Headers).)*)(.*) ((?=From:[ ]*(?<from>[^:]*) ([a-zA-Z\-:]*)))

以日志为例:https://regex101.com/r/yJ7rU4/1

我想在我的 RegEx 中为我的服务器组定义一个值,但我不知道如何编写它以及是否可能。这个值没有写在我的解析文件上,我想把这个信息直接放在我的表达式上,像这样:

^(?<server>=serv1)\[(?<time>[^\]]*)\] (.*) \[(?<filename>[^\]]*)\:(?<line>[^\]]*)\](.*) To: (?<to>((?!\ \-\- Headers).)*)(.*) ((?=From:[ ]*(?<from>[^:]*) ([a-zA-Z\-:]*)))

【问题讨论】:

  • 您的服务器组的字符串在哪里?我在您的示例中没有看到它
  • 您希望您的正则表达式返回一个命名的捕获组,其中包含一个实际未出现在输入字符串中的给定常量文本?这不仅仅适用于正则表达式,因为它们只能返回输入的一部分,而不是输入中没有的东西。
  • @Fede 是的,你是对的,这个服务器名称不在我的输入中,我想将它添加到我的 RegEx 中。
  • @HannoBinder awww ok :s 太糟糕了。谢谢
  • @Maxence 为此发布了一个答案,但是如果发布了更好的样本,您的问题将得到准确回答

标签: regex fluentd


【解决方案1】:

如果您想捕获一些可选字符串(如果存在)并将其放入您的服务器组,那么您只需要使用 0 或更多的贪婪量词......就像这样:

^(?<server>.*?)\[(?<time>[^\]]*)\] (.*) \[(?<filename>[^\]]*)\:(?<line>[^\]]*)\](.*) To: (?<to>((?!\ \-\- Headers).)*)(.*) ((?=From:[ ]*(?<from>[^:]*) ([a-zA-Z\-:]*)))
           ^^^---Here

Working demo

如果您需要服务器名称,您可以使用+ 操作

^(?<server>.+?)\[(?<time>[^\]]*)\] (.*) \[(?<filename>[^\]]*)\:(?<line>[^\]]*)\](.*) To: (?<to>((?!\ \-\- Headers).)*)(.*) ((?=From:[ ]*(?<from>[^:]*) ([a-zA-Z\-:]*)))
           ^^^---Here

【讨论】:

  • 感谢您的 naswer,但我无法在此解析文件中写入我的服务器名称,这些日志来自 php 邮件日志功能。
  • @Maxence 我认为您的意思是我的评论。答案如何?它解决了你的问题吗?
  • 只有当您可以编辑输入/样本时,您的答案才有效,但就我而言,我无法编辑输入。就像你说的“如果它存在”,但服务器名称信息不存在。这就是为什么我想在我的正则表达式中手动添加它。所以在我流利的配置文件中,我只需要编辑我的正则表达式来更改我在每台服务器上的服务器名称。我希望我很清楚,对不起我的英语不好:s
  • @Maxence 我不明白,你没有服务器名称,也不能使用正则表达式?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 2010-12-25
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
相关资源
最近更新 更多