[英]Consolidating 2 regex patterns into one
我編寫了 2 個 preg_match 語句來從日志轉儲中提取 TN、類型和擴展名。 有沒有辦法將 2 個 preg_match 語句合並為一個並仍然獲得正確的提取?
preg_match("/(\d{3} \d \d{2} \d{2}) (\w{3,}).+(\d{4,}+)$/", $newstr, $match_array, PREG_OFFSET_CAPTURE, 29);
if (empty($match_array))
preg_match("/(\d{3} \d \d{2} \d{2}) (\w{3,})/", $newstr, $match_array, PREG_OFFSET_CAPTURE, 29);
我嘗試了這個,但沒有用
preg_match("/(\d{3} \d \d{2} \d{2}) (\w{3,}).+(\d{4,}+)$|(\d{3} \d \d{2} \d{2}) (\w{3,})/", $newstr, $match_array, PREG_OFFSET_CAPTURE, 29);
數據文件內容:
1140E 19 SEP 2018 00 252 1 11 05 1140 8D 4090
1140E 19 SEP 2018 00 252 1 11 06 1140 8D
1140E 4 SEP 2019 00 252 1 11 07 1140 8D 5592
火柴:
252 1 11 05, 1140, 4090
252 1 11 06, 1140
252 1 11 07, 1140, 5592
您可以將原始正則表達式中的最后一個捕獲組設為可選,並將其之前的.+
更改為.+?
使它變得懶惰,以便正則表達式仍然會捕獲存在的結束數字。 例如:
$strings = [
'1140E 19 SEP 2018 00 252 1 11 05 1140 8D 4090',
'1140E 19 SEP 2018 00 252 1 11 06 1140 8D ',
'1140E 4 SEP 2019 00 252 1 11 07 1140 8D 5592'
];
foreach ($strings as $str) {
preg_match('/(\d{3} \d \d{2} \d{2}) (\w{3,}).+?(\d{4,})?$/', $str, $matches);
print_r($matches);
}
輸出:
Array
(
[0] => 252 1 11 05 1140 8D 4090
[1] => 252 1 11 05
[2] => 1140
[3] => 4090
)
Array
(
[0] => 252 1 11 06 1140 8D
[1] => 252 1 11 06
[2] => 1140
)
Array
(
[0] => 252 1 11 07 1140 8D 5592
[1] => 252 1 11 07
[2] => 1140
[3] => 5592
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.