我有一行文本,它总是相同的(除了结尾的消息):
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,这样做虽然可以工作,但不是最好的方式,因为日志消息在某些情况下可能非常长。
我不是正则表达式专家,但我已经找到了以下组合以匹配前两个部分:([^\s]+) ([A-Z]+)
这将返回时间戳和级别。现在我正在努力获取第二组后面的消息-也许我的嵌套根本不完美。任何建议都会让我感到高兴!
注意
消息将从记录级别之后的第一个空格开始。例如:
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"
^(\S+)\h([A-Z]+)\h([^|]+)
https://regex101.com/r/CyMiDJ/1 - The fourth bird(?s)^(\S+)\h+([A-Z]+)\h+(.+)
https://regex101.com/r/WkuRgY/1 但如果有更多以日期和时间开头的行,它会过度匹配。 - The fourth bird^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\+\d{2}:\d{2})\h+([A-Z]+)\h+(.*(?:\R(?!(?1)).*)*)
的模式来匹配多行 https://regex101.com/r/V8wUYy/1 - The fourth bird[^\s]
更优雅地编写为\S
,但如果所有分隔符都是单个空格,则[^ ]
也是适当的。 - mickmackusa