如何在ACL中使用REGEXREPLACE从具有不同类型字符的一长行文本中提取图形(Highbond)

How to extract a figure from a long line of text with different kinds of characters using REGEXREPLACE in ACL (Highbond)

提问人:Emmanuel Salau 提问时间:11/1/2023 最后编辑:Emmanuel Salau 更新时间:11/1/2023 访问量:45

问:

我在名为“Charge_Details”的列中有这种格式的字符串,但略有不同: SBLC费用 <> 1 - 360 天*!<> 400,000.00 美元<> 08/02/18 - 17/12/18 312 <>9

我正在尝试使用正则表达式函数提取美元之前的金额。我正在使用的应用程序(来自 Highbond 的 ACL)只有 REGEXFIND 和 REGEXREPLACE 具有以下语法:REGEXFIND(string, pattern) 和 REGEXREPLACE(string, pattern, new_string) 函数。 您可以忽略此请求的 ACL 脚本部分。我只需要 REGEX 部分的帮助。

它使用与任何其他应用程序相同的 REGEX 规则。

我尝试删除“<<>>”,然后尝试仅返回金额但无济于事。

我首先创建了另一个列(CATEGORY),将所有“<>”替换为“++”和“||”,并排除了“!” EXCLUDE( ALL(REGEXREPLACE(ALL(REGEXREPLACE(charge_details,“<<(\W\W\W\W)>>\s\d{1,2}/\d\d/\d\d”, “++”)), “<<(\w\w\w\w)>>”, “||”)), “!”)IF FIND(“!”, CHARGE_DETAILS)

结果:SBLC FEE||1 - 360 天||400,000.00 美元++ - 17/12/18 312 ||9

当我尝试使用“||”作为分隔符拆分新字符串列时,它只在第一段中返回“SBLC FEE”,在任何其他段中返回空白。

然后,我尝试使用以下命令从我创建的 CATEGORY 列中提取金额: REGEXREPLACE(类别, “(\d{0,3})(,\d{3})*(.\d\d)(\s\w\w\w)|)”,“$1$2$3$4”)

它只是返回 CATEGORY 列中的所有内容,而不是四个组。

谢谢。

sql 正则表达式 acl 正则表达式替换

评论

0赞 Isolated 11/1/2023
您的数据是否始终采用一致的格式,其中美元金额位于字符串的第三个“位置”?
0赞 CAustin 11/1/2023
您只是在寻找“美元”之前的数字,还是想要排除这种情况?
0赞 Emmanuel Salau 11/1/2023
@Isolated大量的线路,是的。有时它处于第二或第四位。
0赞 Emmanuel Salau 11/1/2023
@CAustin是的。我只是在寻找美元之前的数字。
0赞 CAustin 11/1/2023
那么这很简单,没有必要弄乱分隔符 regex101.com/r/bPigyS/1

答:

0赞 Gary_W 11/1/2023 #1

此示例在 Oracle 中,但应该可以帮助您使用正则表达式。WITH 子句只是设置测试数据。正则表达式说,匹配零个或多个字符,后跟一个空格,后跟一个或多个数字,后跟零个或多个字符(非贪婪),直到后面跟着字面上的“spaceUSD”,然后是其他任何字符。注意“后跟零个或多个字符的数字”部分周围的括号。这意味着一个“被记住”的群体。将整个字符串替换为记住的组 #1。

with tbl(str) as (
  select 'SBLC FEE <> 1 - 360 day*!<> 400,000.00 USD<> 08/02/18 - 17/12/18 312 <>9'
   from dual
 )
 select regexp_replace(str, '.* (\d+.*?) USD.*', '\1') as USD
 from tbl;


USD       
----------
400,000.00
1 row selected.

评论

0赞 Emmanuel Salau 11/1/2023
你好。感谢您的输入。所以我尝试了这个,但我使用的应用程序只是继续并在使用 dotall 时返回相同的内容。它不包括美元,因为它不属于该组。以下是它返回的内容: SBLC FEE<<CHIB>> 1 - 360 天*!400,000.00<<CHPE>> 08/02/18 -02/02/19 359 <<DAY2>>9
0赞 Emmanuel Salau 11/1/2023
我将该表导入 SSMS,看看是否可以使其以这种方式工作。我在ACL中进行了这些调整,现在工作正常:REGEXREPLACE(columnwithstrings, '[\w\W]* (\d{1,3}(,\d{3})*(\.\d+)?)(\w{3}?)[\w\W]*', “$1”) ACL 将 \1 视为递归(这就是我改用 $1 的原因),并且还有其他货币(因此是 \w{3})。\w 是任何单词字符,\W 是任何非单词字符。不知道这在其他应用程序中是否相同。今晚第一次使用正则表达式函数。非常感谢您的意见。绝对为我指明了正确的方向。