REGEX提取没有货币的金额

问题描述

SELECT
    ocr_text,bucket,REGEXP_EXTRACT('-?[0-9]+(\.[0-9]+)?',ocr_text)
FROM temp

我正在尝试从不存在货币的字符串中提取金额。没有小数的任何数字都不应匹配。假定逗号遵循正确的规则(以数百个标记为准),则应允许使用

56         no       (missing decimals)
56.45      yes  
120        no       (missing decimals)
120.00     yes
1200.00    yes
1,200.00   yes
1,200      no       (missing decimals)
1200       no       (missing decimals)
134.5      no       (decimal not followed by 2 digits)
23,00.00   no       (invalid comma location)

我不是REGEX的菜鸟,所以我知道我的上述声明已经不符合我列出的条件。但是,我已经陷在(INVALID_FUNCTION_ARGUMENT) premature end of char-class行上了错误REGEX_EXTRACT


有人可以指出我正确的方向吗?我该如何解决当前问题?如何修改以正确合并列出的其他条件?

解决方法

这是一个常规的正则表达式模式,用于带两个小数位和可选的数千个逗号分隔符的正/负数:

(?<!\S)(?:-?[0-9]{1,3}(,[0-9]{3})*(\.[0-9]{2})|-?[0-9]+(\.[0-9]{2}))(?!\S)

Demo

您更新的查询:

SELECT
    ocr_text,bucket,REGEXP_EXTRACT(ocr_text,'(?<!\S)(?:-?[0-9]{1,[0-9]{3})*(\.[0-9]{2})|-?[0-9]+(\.[0-9]{2}))(?!\S)')
FROM temp;

根据我阅读的Presto文档,据说它支持Java的regex语法。如果环视无法正常工作,则可以尝试以下版本:

SELECT
    ocr_text,'(\s|^)(?:-?[0-9]{1,[0-9]{3})*(\.[0-9]{2})|-?[0-9]+(\.[0-9]{2}))(\s|$)')
FROM temp;
,

REGEXP_EXTRACT('^ [-]?(\ d *。\ d *)',ocr_text)

模式:^[-]?(\d*\.\d*)

说明

^-行首

[-]?-带有或不带有负破折号(-)

\d*-0或更多数字

\.-小数点(已转义,因为在正则表达式中小数点被视为特殊字符)

\d*-0或更多数字(小数部分);

$-行尾。

奖金提示:test your regex上有在线有用的工具!