regexp货币字符串,带小数和千位分隔符

时间:2017-12-13 20:22:22

标签: php regex

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
(
)

1 个答案:

答案 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位数字
  • $ - 字符串结束。