使用這種模式:/Amount:\K\d+/
它會準確地提取所需的全部數量每個Amount:
後面的eric值不使用效率低得多的「周邊」。
我的網頁過濾軟件不允許我訪問您的pastelabs鏈接,所以我看不到您的實際輸入。 (這是你爲什麼要將你的輸入樣本直接發佈到你的問題中的很多原因之一)。你聲明你有幾行你必須從中提取,所以這是我已經測試過的樣本輸入:
Date:21 Month:03 Year:2017 Amount:50 Category:Grocery Account:bank Note:expensive
Date:1 Month:04 Year:2017 Amount:150 Category:Grocery Account:bank Note:expensive
Date:14 Month:04 Year:2017 Amount:5 Category:Grocery Account:bank Note:expensive
Date:28 Month:04 Year:2017 Amount:5935 Category:Grocery Account:bank Note:expensive
我的模式僅在48步驟中捕獲了所需的結果。 (Pattern Demo)
該模式使用\K
,意思是「從這一點開始保留角色」,因此不需要捕捉組,也不需要「向後看」。
如果您的實際輸入數據具有Amount:
和數字值之間的可選空格,則只需將?
(空格然後問號)添加到:
之後的模式。
當與preg_match_all()
一起使用時,輸出數組小至preg_match_all()
可以做成:包含1個具有4個元素的子陣列的數組。我直接切到子陣在我的代碼如下:
代碼:(Demo)
$in='Date:21 Month:03 Year:2017 Amount:50 Category:Grocery Account:bank Note:expensive
Date:1 Month:04 Year:2017 Amount:150 Category:Grocery Account:bank Note:expensive
Date:14 Month:04 Year:2017 Amount:5 Category:Grocery Account:bank Note:expensive
Date:28 Month:04 Year:2017 Amount:5935 Category:Grocery Account:bank Note:expensive';
var_export(preg_match_all('/Amount:\K\d+/',$in,$out)?$out[0]:[]);
輸出:
array (
0 => '50',
1 => '150',
2 => '5',
3 => '5935',
)
至於此頁面上的其他答案,他們都通過步驟處理我的測試數據(比我的模式慢12倍以上/效率低)。在這篇文章的時候,其中一個是完全錯誤的,有些使用馬虎的正則表達式語法,不應該從中學習。
@ chris85添加了一個代碼鏈接。請看一下。 – n00b12345
data.txt的內容在這裏:http://paste.ideaslabs.com/show/5TxWH8MUX – n00b12345
@ chris85我非常抱歉。張貼之前編輯過多:無論如何這裏是:http://paste.ideaslabs.com/show/hwj7IiPUcd – n00b12345