使用这种模式:/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