从字符串中获取一些数字我有点问题。
例如我有这种str:
qweqeqe (qweqwe) AASD 213,21 ( -1201,77 EUR )
我需要括号之间带逗号的数字
结果:-1201,77
价值也可以是积极的。
我已经设法获得浮动值,但是从所有字符串。
我有这个:!\d+(?:\,\d+)?!
但它获得了str中的所有数字。
答案 0 :(得分:2)
如果在父母身上总共有1个号码......
这是一个两遍“可读”的方法:提取所有括号子串,然后使用preg_filter
提取浮点值:
$s = "qweqeqe (qweqwe) AASD 213,21 ( -1201,77 EUR )";
preg_match_all('/\([^()]*\)/', $s, $parentheses);
$res = preg_filter('/.*?([+-]?\d+(?:,\d+)?).*/s', '$1', $parentheses[0]);
^^^ ^
请参阅IDEONE demo
在这里,我们匹配浮动之前和之后的任何符号.*
。请注意,为了保留数字,我们需要在左侧部分(.*?
)中使用延迟点匹配,并且我们可以匹配数字后部分中的任何内容。由于数字前的+
/ -
是可选的,请使用?
量词:[-+]?
。
如果父母身上的数字超过1个......
这是一种不太可读的一次通过方法:
$s = "qweqeqe (qweqwe) AASD 213,21 ( -1201,77 EUR )";
preg_match_all('/(?:\(|(?!^)\G)[^()]*?([+-]?\d+(?:,\d+)?)(?=[^()]*\))/', $s, $matches);
^^^^
这里,正则表达式定义了(?:\(|(?!^)\G)
的起始边界(即,在(
之后开始查找数字,然后在每次成功匹配之后),然后使用[^()]*?(\d+(?:,\d+)?)
捕获浮点数但要确保我们仍然在括号内(使用(?=[^()]*\))
前瞻检查最右边界。)
答案 1 :(得分:0)
尝试这种模式:
$pattern = "#\([\s]*(-{0,1}[0-9]+,[0-9]+)[\s]*[A-Za-z]*[\s]*\)#";