PHP正则表达式如何捕获末尾没有字母的浮点数

时间:2017-04-13 17:55:24

标签: php regex

我正在使用preg_match_all,我想捕获没有字母的浮点数。

例如

-20.4a 110b 139 31c 10.4

所需

[0] => Array
    (
        [0] => 139
        [1] => 10.4
    )

我尝试过使用这种模式可以做到相反:

  

/ \ d +(。\ d +)?(?= [A-Z])/ I

使用you can see in this demo字母捕获数字。但我无法弄清楚如何捕捉没有尾随字母的数字。

3 个答案:

答案 0 :(得分:2)

使用否定前瞻:

/\d+(\.\d+)?(?![a-z])/i

但这还不够,你还要排除数字和点:

/\d+(?:\.\d+)?(?![a-z\d.])/i

<强> PHP:

$string = '-20.4a 110b 139 31c 10.4';
preg_match_all('/\d+(?:\.\d+)?(?![a-z\d.])/', $string, $match);
print_r($match);

<强>输出:

Array
(
    [0] => Array
        (
            [0] => 139
            [1] => 10.4
        )

)

答案 1 :(得分:1)

你可以使用这个正则表达式做出积极的前瞻:

[+-]?\b\d*\.?\d+(?=\h|$)

RegEx Demo

(?=\h|$)断言在匹配的数字后存在水平空格或行尾。

或者您可以将此正则表达式用于占有量词:

[+-]?\b\d*\.?\d++(?![.a-zA-Z])

RegEx Demo 2

答案 2 :(得分:1)

这里可以采取一些方法。

原子组匹配和负前瞻或字边界:

(?>\d+(?:\.\d+)?)(?![a-z])
(?>\d+(?:\.\d+)?)\b

使用否定前瞻也拒绝点和数字:

\d+(?:\.\d+)?(?![a-z.\d])

空格的正向预测(这里似乎是分隔符)或字符串

的结尾

\d+(?:\.\d+)?(?=\s|$)