【发布时间】:2022-01-13 20:06:58
【问题描述】:
我需要一些帮助,因为我不是 PHP RegEx 专家。我这里有这行文字,总是一样的(除了最后的信息):
2021-12-08T18:18:38+00:00 INFO Produktbestand erfolgreich von Collmex abgerufen | "STOCK_AVAILABLE;23;1;363;PCE;-1\r\nMESSAGE;S;204020;Daten?bertragung erfolgreich. Es wurden 1 Datens?tze verarbeitet.\r\n"
我有 3 个函数应该返回部分日志条目:
public function get_log_file_entry_time( string $entry ): string {
}
public function get_log_file_entry_level( string $entry ): string {
}
public function get_log_file_entry_message( string $entry ): string {
}
我首先尝试使用带有空格作为分隔符的explode,这虽然有效,但不是最好的方法,因为在某些情况下日志消息可能很长。
我不是 RegEx 专家,但我找到了以下组合来匹配前两个部分:([^\s]+) ([A-Z]+)
这将返回时间戳和级别。现在我很难在第二组之后得到消息 - 也许我的嵌套根本不完美。任何建议都会让我开心!
通知
消息将在日志记录级别后的第一个空格之后开始。例如:
Produktbestand erfolgreich von Collmex abgerufen | "STOCK_AVAILABLE;23;1;363;PCE;-1\r\nMESSAGE;S;204020;日期?bertragung 埃尔福格雷希。 Es wurden 1 Datens?tze verarbeitet.\r\n"
【问题讨论】:
-
如果消息是管道字符之前的部分,那么可能像这样
^(\S+)\h([A-Z]+)\h([^|]+)regex101.com/r/CyMiDJ/1 -
管道是消息的一部分!该消息将在日志级别之后开始。
-
所以你想匹配字符串的其余部分,包括换行符?这是唯一的字符串还是有更多具有相同格式的字符串?匹配字符串的其余部分可以像这样
(?s)^(\S+)\h+([A-Z]+)\h+(.+)regex101.com/r/WkuRgY/1,但如果有更多行以日期和时间开头,它将过度匹配。 -
您可以使用
^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2})\h+([A-Z]+)\h+(.*(?:\R(?!(?1)).*)*)之类的模式用于多行regex101.com/r/V8wUYy/1 -
制表符是否用作分隔符?还是所有部分都由一个空格分隔?
[^\s]写成\S更优雅,但如果所有分隔符都是单个空格,那么[^ ]也是合适的。