REGEX 提取没有货币的金额

REGEX Extract Amount Without Currency

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 的新手,所以我知道我的上述陈述已经不符合我列出的标准。但是,我已经在 REGEX_EXTRACT

上遇到错误 (INVALID_FUNCTION_ARGUMENT) premature end of char-class

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

这是 positive/negative 数字的通用正则表达式模式,带有两位小数和可选的千位逗号分隔符:

(?<!\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,3}(,[0-9]{3})*(\.[0-9]{2})|-?[0-9]+(\.[0-9]{2}))(?!\S)')
FROM temp;

根据我阅读的 Presto 文档,它应该支持 Java 的正则表达式语法。如果环顾四周不起作用,您可以尝试这个版本:

SELECT
    ocr_text,
    bucket,
    REGEXP_EXTRACT(ocr_text, '(\s|^)(?:-?[0-9]{1,3}(,[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!

有一些有用的在线工具

下面的代码可以像所有数字一样提取值,但它捕获了所有值,仅特定于某些字母表,效果不佳。哪位好心人建议一下。

-?\d+\.?\d*

我已经使用 Regex 完成了 NLP 方面的工作。