簡體   English   中英

將 2 個正則表達式模式合並為一個

[英]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
)

3v4l.org 上的演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM