如何解决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上有在线有用的工具!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。