正则表达式匹配以点开头的数字

时间:2013-07-24 14:43:00

标签: php regex preg-replace preg-match

我有一个字符串:

Product, Q.ty: 1, Price: 120.00

我想在第一个逗号之后选择最后两位小数(.00)之后的所有内容 - 换句话说,选择Product,这将是可变的;不变量的是, Q.t,并且还知道字符串中的最后两个字符将是以点.开头的两个数字 - 但是只有最后一个字符始终为0 ,它前面的那个可以是任何0-9,但总是一个数字。

我用它来匹配字符串:

preg_replace('/' . preg_quote(', Q.t') . '.*?' . preg_quote('.00') . '/', '', $data );

问题是,当最后两位数字不是00但是其他东西如50,40,30等时失败。如果我使用相同的正则表达式与单个数字'0',它将无法正常工作,因为它将捕获字符串中的第一个0,就像我之前的示例中一样,并将遗漏剩余的0。

如何调整此表达式以捕获前面带有'。'的数字组。点?

*还有一点需要注意:这个preg_replace在foreach循环中;我试图通过的所有模式都不会匹配某些数据;这是好的,所以在那些情况下,我可以按照它们的方式打印字符串;但是对于foreach中匹配的情况,我想用零替换部分字符串*

谢谢

5 个答案:

答案 0 :(得分:2)

为什么不

/(\d+\.\d{2})$/

会捕获带小数位的任何尾随“数字”吗?

答案 1 :(得分:2)

 /([^,]*), Q\.ty: (\d*), Price: (\d*\.\d{2})/

通过使用([^,]*),,它将使用字符串中的逗号作为第一个分隔符。这将捕获字符串的开头直到第一个逗号,第二个匹配将是数量,最后一个匹配将是价格。

所以你提供的字符串:

 Product, Q.ty: 1, Price: 120.00

将返回

$1 = Product
$2 = 1
$3 = 120.00

在附注中我不知道Q.ty中的Q之后的那个时期是你的例子中的故意还是仅仅是一个错字。

答案 2 :(得分:2)

你可以尝试

(.+?), (Q\.ty: \d+, .+?\.\d{2})

这应该捕获从第一个逗号到最后两个十进制数字到$ 2的所有内容,产品标签保存在$ 1

答案 3 :(得分:2)

我认为某人(总有)会说“你可以通过str_replace()explode()得到这些作品。”然而,它并不快。

<?php

$string = "Product, Q.ty: 1, Price: 120.00";
$removals = array(",",":");


$stime = microtime();
    $nstring = str_replace($removals,'',$string);
    $parts = explode(" ",$nstring);

echo microtime()-$stime."secs\n";
    print_r($parts);

$pattern = "!^([A-Za-z]+),\s([A-Za-z.]+)\:\s([0-9]+),\s([A-Za-z]+):\s([0-9.]+)$!";

$ptime = microtime();
    $m = preg_match($pattern,$string,$matches);
echo microtime()-$ptime."secs\n";

print_r($matches);

?>

<强>输出

4.0999999999958E-5secs
Array
(
    [0] => Product
    [1] => Q.ty
    [2] => 1
    [3] => Price
    [4] => 120.00
)
3.5000000000007E-5secs
Array
(
    [0] => Product, Q.ty: 1, Price: 120.00
    [1] => Product
    [2] => Q.ty
    [3] => 1
    [4] => Price
    [5] => 120.00
)

使用更文字的方法,提供$string不会偏离,不会提高preg_match函数的性能。

$pattern = "!^(Product), (Q\.ty): ([0-9]+), (Price): ([0-9.]+)$!";

答案 4 :(得分:1)

如果你想要一个文字点,你应该看看:\。