https://regex101.com/r/3e0fbp/2
我有一些模式可以匹配货币金额,但有些模式不能100%运作
草堆
(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*[.,]\d{2}-?(?![\d.,%]|(?: %))
匹配2位小数(不匹配百分比)
(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*(?:[^.,]|[.,]\d{1,2})-?(?![\d.,%]|(?: %))
这种模式有效!
匹配金额为0-2小数(不匹配百分比)
20%
此模式不起作用。匹配(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*[.,]\d{1,2}-?(?![\d.,%]|(?: %))
匹配数量为1-2位小数(不匹配百分比)
(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*[.,]\d{2}-?(?![\d.,])
这种模式有效!
匹配金额为2位小数(可能与百分比匹配)
(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*(?:[^.,]|[.,]\d{1,2})-?(?![\d.,])
这种模式有效!
匹配金额为0-2小数(可能与百分比匹配)
333.294
此模式不起作用。与(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*[.,]\d{1,2}-?(?![\d.,])
匹配数量为1-2位小数(可能与百分比匹配)
function get_number_pattern(int $decimals_min=2, int $decimals_max=2, bool $allow_percentage=false): string{
$pattern = '(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*';
if($decimals_min || $decimals_max){
if($decimals_min == $decimals_max){
$decimal_num = $decimals_min;
}
else{
$decimal_num = ($decimals_min ?: '1').','.$decimals_max;
}
$decimals = '[.,]\d{'.$decimal_num.'}';
if($decimals_min){
$pattern .= $decimals.'-?';
}
else{
$pattern .= '(?:[^.,]|'.$decimals.')-?';
}
}
$negative_trailing = [
'[\d'.($decimals ? '.,' : '').($allow_percentage ? '' : '%').']'
];
if(!$allow_percentage){
$negative_trailing[] = '(?: %)';
}
$pattern .= '(?!'.implode('|', $negative_trailing).')';
return $pattern;
}
echo get_number_pattern()."\n";
echo get_number_pattern(0, 2)."\n";
echo get_number_pattern(1, 2)."\n";
echo get_number_pattern(2, 2, true)."\n";
echo get_number_pattern(0, 2, true)."\n";
echo get_number_pattern(1, 2, true)."\n";
这种模式有效!
码
{{1}}
答案 0 :(得分:0)
尝试这是第一个问题(在第一个数字后你错过了小组中的%
):
(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*(?:[^.,%]|[.,]\d{1,2})-?(?![\d.,%]|(?: %))
这是第二个(这里你错过了最后的%
和空格):
(?<![\d.,])-?\d{1,3}(?:[,. ]?\d{3})*(?:[^.,]|[.,]\d{1,2})-?(?![\d.,])(?: ?%)?