我刚刚开始学习正则表达式,我有一个这样的例子
23.0003NOV14DIX
。我想提取 23.00
和 03NOV14DIX
。
我试过这个:
preg_match("/(?P<a>[0-9]\.[0-9]{2}+)\s+(?P<supplierPrice>)[^\s]\s+/", $line, $matches);
但是它不起作用。我的想法是提取数字直到遇到字符
.
,然后再提取 2 位数字和其余的数字。
您可以使用这个正则表达式:
^(?P<a>\d+\.\d{2})(?P<supplierPrice>.+)$
preg_match("/(\d{2}\.\d{2})(\d{2}\S{3}\d{2}\S{3})/U", $line, $matches);
print_r($matches);
在您的情况下,它不匹配,因为您只允许在点之前使用一位数字
[0-9]\.
应该使用
[0-9]+\.
如果您想要点前有任何数字。然后你应该将其他所有内容与
相匹配.*
然后结果应该是
preg_match("/(?P<a>[0-9]+\.[0-9]{2})(?P<supplierPrice>.*)/", $line, $matches);
或者使用 \d 代替 [0-9]
preg_match("/(?P<a>\d+\.\d{2})(?P<supplierPrice>.*)/", $line, $matches);
您的正则表达式语法不正确,在初始字符类之后缺少量词,在这种情况下它只允许“一个”数字。其次,您尝试使用串联运算符 (
'.'
) 将两个命名组连接在一起。同样,最后命名的组与任何内容都不匹配。
以下内容应该适合您。
preg_match('/(?P<a>[0-9]+\.[0-9]{2})(?P<supplierPrice>\S+)/', $line, $matches);
我认为您正在执行“文本提取”而不是“文本验证”,但我将演示两者。 演示
如果只需要在小数点后第二位之后的位置分割字符串,那么
preg_split()
是理想的选择。 \K
告诉正则表达式引擎“忘记”任何先前匹配的字符——这确保小数字符不会被用作两半之间的分隔符。
var_export(
preg_split('/\.\d{2}\K/', $string)
);
如果您尝试验证整个字符串并提取两个部分,那么
preg_match()
更适合 - 但随后我们可能需要查看一组潜在输入,以便我们可以制作准确的正则表达式模式。
var_export(
preg_match('/^(\d+\.\d{2})((?:\d{2}[A-Z]{3}){2})$/', $string, $m)
? array_slice($m, 1)
: []
);
两个片段给出相同的输出:
array (
0 => '23.00',
1 => '03NOV14DIX',
)