我一直在使用正则表达式,如下所示。我的目标是从字符串中提取一次小数点数,如8.4。我使用的代码是:
$reg = "/[0-9]+[ ]+([0-9]\.[0-9])/";
preg_match_all($reg, $buffer, $matches);
对于像
这样的输入0000001222 86257 8.4
我将数组$匹配为:
Array
(
[0] => Array
(
[0] => 86257 8.4
)
[1] => Array
(
[0] => 8.4
)
)
为什么模式匹配2次?我希望我的匹配数组如下:
Array
(
[0] => 8.4
)
答案 0 :(得分:0)
正则表达式中的匹配#0(几乎)始终是整个匹配的字符串。在您的情况下,因为您正在使用括号(capture group),所以您告诉表达式也捕获匹配字符串的子集。从匹配#1开始返回捕获组。
如果您明确不想捕获完整字符串,请考虑使用lookarounds;请注意,您需要稍微重构一下表达式,因为PHP lookbehinds中的外观需要为零宽度,因此不允许使用量词(+)。
答案 1 :(得分:0)
您应该检查manual(PREG_PATTERN_ORDER
是默认设置):
对结果进行排序,以便$ matches [0]是完整模式匹配的数组,$ matches [1]是由第一个带括号的子模式匹配的字符串数组,依此类推。
因此,在您的情况下,您想要的结果将始终位于$matches[1]
。