将浮点值和日期表达式与字符串分开,不带分隔符

问题描述 投票:0回答:6

我刚刚开始学习正则表达式,我有一个这样的例子

23.0003NOV14DIX
。我想提取
23.00
03NOV14DIX

我试过这个:

preg_match("/(?P<a>[0-9]\.[0-9]{2}+)\s+(?P<supplierPrice>)[^\s]\s+/", $line, $matches);

但是它不起作用。我的想法是提取数字直到遇到字符

.
,然后再提取 2 位数字和其余的数字。

php regex text-parsing
6个回答
2
投票

您可以使用这个正则表达式:

^(?P<a>\d+\.\d{2})(?P<supplierPrice>.+)$

1
投票

以下作品。

\s*(?P<a>\d+\.\d{2})(?P<supplierPrice>[^\s]+)\s*

演示


1
投票
   preg_match("/(\d{2}\.\d{2})(\d{2}\S{3}\d{2}\S{3})/U", $line, $matches);
   print_r($matches);

1
投票

在您的情况下,它不匹配,因为您只允许在点之前使用一位数字

[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);

1
投票

您的正则表达式语法不正确,在初始字符类之后缺少量词,在这种情况下它只允许“一个”数字。其次,您尝试使用串联运算符 (

'.'
) 将两个命名组连接在一起。同样,最后命名的组与任何内容都不匹配。

以下内容应该适合您。

preg_match('/(?P<a>[0-9]+\.[0-9]{2})(?P<supplierPrice>\S+)/', $line, $matches);

0
投票

我认为您正在执行“文本提取”而不是“文本验证”,但我将演示两者。 演示

如果只需要在小数点后第二位之后的位置分割字符串,那么

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',
)
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.