https://www.tehplayground.com/KWmxySzbC9VoDvP9
为什么第一个字符串匹配?
$list = [
'3928.3939392', // Should not be matched
'4.239,99',
'39',
'3929',
'2993.39',
'393993.999'
];
foreach($list as $str){
preg_match('/^(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*(?:[^.,%]|[.,]\d{1,2})-?(?![\d.,%]|(?: %))$/', $str, $matches);
print_r($matches);
}
Array
(
[0] => 3928.3939392
)
Array
(
[0] => 4.239,99
)
Array
(
[0] => 39
)
Array
(
[0] => 3929
)
Array
(
[0] => 2993.39
)
Array
(
)
答案 0 :(得分:2)
您似乎希望将这些数字作为独立字符串进行匹配,因此,您不需要使用外观,您只需要使用锚点。
您可以使用
^-?(?:\d{1,3}(?:[,. ]\d{3})*|\d*)(?:[.,]\d{1,2})?$
请参阅regex demo
<强>详情
^
- 字符串开头-?
- 可选的-
(?:
- 非捕获交替组的开始:
\d{1,3}(?:[,. ]\d{3})*
- 1到3位数字,后跟0 + ,
,.
或空格的序列,然后是3位|
- 或\d*
- 0+位数)
- 小组结尾(?:[.,]\d{1,2})?
- .
或,
的可选序列,后跟1或2位数字$
- 字符串结束。