使用正则表达式提取没有货币符号的金额。

3
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_EXTRACT 行上遇到了错误 (INVALID_FUNCTION_ARGUMENT) premature end of char-class


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


3
公平地说,世界上只有大约五个人能理解正则表达式。不用太担心。 - Captain Kenpachi
1
@CaptainKenpachi Wiktor Stribiżew 可能被认为是五个中的一位 :-) - Tim Biegeleisen
是的,他来自世界上许多天才涌现的地区。 - Captain Kenpachi
3个回答

2

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

正则表达式:^[-]?(\d*\.\d*)

说明

^ - 行的开头

[-]? - 有或没有负号 (-)

\d* - 0 或多个数字

\. - 一个小数点(需要转义,因为在正则表达式中小数点被认为是特殊字符)

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

$ - 行结尾。

额外提示:有一些在线工具可以帮助你测试你的正则表达式


2

以下是一个正/负数的通用正则表达式模式,保留两位小数,并可选地添加千位分隔符:

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

演示

您更新后的查询:

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;

@urdearboy 请重新加载页面并尝试我的查询的第二个版本。这个版本应该可以正常工作,没有任何问题。 - Tim Biegeleisen
你的更新版本仍然存在同样的问题 :(。尽管如此,还是要给你点赞,感谢你的时间。 - urdearboy
@urdearboy,找到了你的另一个问题。REGEXP_EXTRACT 的语法是输入先出现,然后是正则表达式模式。再试一次看看现在是否正常工作。 - Tim Biegeleisen
只是为了记录,你能否检查两个版本并在这里评论哪一个对你有效? - Tim Biegeleisen
1
它们实际上都起作用了。使用正则表达式运行查询,列是相等的。 - urdearboy

0
以下代码可以提取所有数字的值,但它会捕获所有内容,只有特定的字母时它才能正常工作。请问有人能提出好的建议吗?
-?\d+\.?\d*

我使用正则表达式进行了自然语言处理方面的工作。


这并没有真正回答问题。如果您有不同的问题,可以点击[提问](https://stackoverflow.com/questions/ask)来提出。如果您想在此问题获得新的回答时得到通知,您可以[关注此问题](https://meta.stackexchange.com/q/345661)。一旦您拥有足够的[声望](https://stackoverflow.com/help/whats-reputation),您还可以[添加悬赏](https://stackoverflow.com/help/privileges/set-bounties)以引起更多关注。- [来自评论审核](/review/late-answers/30741312) - pringi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接