PHP 正则表达式获取括号内的浮点值

PHP regular expression get float value between brackets

我在从字符串中获取一些数字时遇到一点问题。

比如我有这样的str:

qweqeqe (qweqwe) AASD 213,21 ( -1201,77 EUR )

我需要括号内带逗号的数字 结果:-1201,77 该值也可以是正数。 我已经设法获得浮点值,但来自所有字符串。 我有这个:!\d+(?:\,\d+)?! 但它在 str.

中获取所有数字

试试这个模式:

$pattern = "#\([\s]*(-{0,1}[0-9]+,[0-9]+)[\s]*[A-Za-z]*[\s]*\)#";

如果括号内始终有 1 个数字...

这是一个两遍的 "readable" 方法:提取所有带括号的子字符串,然后使用 preg_filter 提取浮点值:

$s = "qweqeqe (qweqwe) AASD 213,21 ( -1201,77 EUR )";
preg_match_all('/\([^()]*\)/', $s, $parentheses);
$res = preg_filter('/.*?([+-]?\d+(?:,\d+)?).*/s', '', $parentheses[0]);
                     ^^^     ^

IDEONE demo

这里,我们用.*匹配float前后的任何符号。请注意,为了保留数字,我们需要在左侧部分(.*?)使用惰性点匹配,我们可以匹配数字后面部分的任何内容。由于数字前的 +/- 是可选的,因此使用 ? 量词:[-+]?.

如果括号内可以有超过 1 个数字...

这是一种可读性较差的一次性方法:

$s = "qweqeqe (qweqwe) AASD 213,21 ( -1201,77 EUR )";
preg_match_all('/(?:\(|(?!^)\G)[^()]*?([+-]?\d+(?:,\d+)?)(?=[^()]*\))/', $s, $matches);
                                       ^^^^

another IDEONE demo

这里,正则表达式用(?:\(|(?!^)\G)定义起始边界(即开始寻找(之后的数字,然后在每次匹配成功之后)然后用[=21捕获浮点数=] 但确保我们仍在括号内(最右边的边界使用 (?=[^()]*\)) 前瞻检查)。