如何从包含整数的字符串中仅提取浮点数(小数)

时间:2017-02-20 21:00:38

标签: php regex

我找不到合适的正则表达式来从字符串中仅提取浮点数。 请考虑以下字符串:

$string = "8x2.1 3x2";

我想提取2.1,我尝试了以下但是这给了我整数和浮点数:

preg_match_all('/[0-9,]+(?:\.[0-9]*)?/', $string, $matches);

然后我尝试使用is_float检查浮点数,但由于某种原因,这也会返回整数。有任何想法吗? 感谢

2 个答案:

答案 0 :(得分:6)

考虑这个简单的例子:

List<List<Integer>> columns = new ArrayList<>();

匹配“一个或多个数字,然后恰好一个句号,再一个或多个数字”。

输出显然是:

<?php
$input = "8x2.1 3x2";
preg_match('/\d+\.\d+/', $input, $tokens);
print_r($tokens);

答案 1 :(得分:3)

你的正则表达式匹配浮点数和整数,甚至是只包含逗号的字符串。

  • [0-9,]+ - 一位或多位数或,
  • (?:\.[0-9]*)? - . +零个或多个数字的一​​个或零个序列。

你需要

/\d+\.\d+/

这将匹配1位数,.和1位数。

或者,为了匹配负片和正片,请在开头添加一个可选的-

/-?\d+\.\d+/

<强>详情

  • -? - 一个或零个连字符(?表示匹配一个或零个匹配
  • \d+ - 一个或多个数字(+表示匹配一个或多个匹配项\d匹配数字字符数)
  • \. - 一个文字点(因为正则表达式中的点是一个特殊的元字符,它应该被转义以表示一个文字点)
  • \d+ - 一个或多个数字

PHP demo

$string = "8x2.1 3x2";
preg_match_all('/\d+\.\d+/', $string, $matches);
print_r($matches[0]);
// => Array ( [0] => 2.1 )

奖励正则表达式也只匹配带有可选指数的浮点数(正则表达式regular-expressions.info的变体):

 /[-+]?\d+\.\d+(?:e[-+]?\d+)?/i

在这里,您可以看到首先匹配可选的+-[-+]?),然后使用与上面相同的模式,然后是可选的非捕获组(?:...)?匹配以下序列的1或0次出现:eE(因为/i是不区分大小写的修饰符),[-+]?匹配可选{ {1}}或+,\ d +`匹配1位数。