oracle 替换文本块中的动态文本- PLSQL - REGEX

g52tjvyc  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(123)

我如何在plsql中替换一个不知道当前位置或短语长度的文本,也不知道位置,因为它可以是动态的。
我已经能够达到的可能的解决方案如下,我在regex的在线平台上尝试过,它给了我预期的结果,但当我实现它时,我得到了意想不到的值。
我发现的模式是,大多数时候它要么以,;space结尾,几乎总是以USO:结尾,例如:FORMA DE PRESENTACIÓN Y EMPAQUE: XXX; USO:
要提取或替换的单词:

  • FORMA DE PRESENTACIÓN Y EMPAQUE:XXX;
  • FORMA DE PRESENTACIÓN Y EMPAQUE:BOTELLA ALUMINIO POR:5KG、10KG、20KG、25KG、50KG、100gr、250gr、500gr、300gr - CAJAS POR:10 KG、15 KG、20 KG、25 KG、50LB、- TAMBOR POR:25 KG、50 KG、5KG、50 LB、180 KG、20KG、4KG - GARRAFA POR:10 KG、25 KG、20 KG、5KG、10 KG、1 KG,- SACOS POR:20 KG、25KG、50LB、10KG - FRASCOS POR:25gr、250gr、500gr、100gr、250gr、1KG、300gr、1000gr - TARROS POR:1000克、20克、25克、100克、2500克、250克、500克、50克、1千克。;
  • FORMA DE PRESENTACIÓN Y EMPAQUE/ PRESENTACION COMMERCIAL:CAJAS DE 15KG // 20KG // 25KG // SACOS DE 22.68KG // FRASCOS DE 0.05KG// 0.025KG // 0.10KG // 0.25KG // 0.50KG // 0.30 KG // 1KG;
  • FORMA DE PRESENTACIÓN Y EMPAQUE:XXX PENDT XXXX;
  • FORMA DE PRESENTACIÓN Y EMPAQUE:* PENDIENTE *;

正文:
Lorem ipsum dolor sit amet,consectetur adipiscing elit.前庭被怀疑为不发罗音的扭曲,因动情而发。在他的著作中有这样的名言。我们的生命不能被怀疑,我们的生命不能被怀疑。埃尼亚人在埃及的时候,把自己的心放在心上。Nullam ac interdum libero.在FORMA DE PRESENTACIÓN Y EMPAQUE: XXX; USO中:volutpat venenatis ullamcorper.在神圣的时间里,你会看到美丽的眼睛。在他的著作中有这样的名言。你没有力量,你的生命就没有力量。Mauris et molestie libero.
Regex:
^.*?(FORMA\sDE\sPRESENTACI[OÓ]?N\sY\sEMPAQUE(?:(?:[\/\s]+)PRESENTACI[OÓ]N\sCOMERCIAL)?(?:[\:\s[A-Za-zÀ-ÿ,0-9;\.%*\t\-]+)[,;]\s)(?:[U]).*$
Demo

mrzz3bfm

mrzz3bfm1#

  • Oracle不支持非捕获组(?:),仅使用捕获组()或不使用组
  • [\/\s]将匹配\/\s的单个字符,这可能不是您想要的;您可能希望省略转义字符(因为它不转义任何内容),并使用POSIX字符集[:space:],如下所示[/[:space:]]

所以你的正则表达式应该是:

^.*?(FORMA\sDE\sPRESENTACI[OÓ]?N\sY\sEMPAQUE([/[:space:]]+PRESENTACI[OÓ]N\sCOMERCIAL)?[:[:space:]A-Za-zÀ-ÿ,0-9;\.%*\t\-]+[,;]\s)U.*$

字符串

  • 注意:不要使用regex 101测试Oracle正则表达式;它不使用与Oracle相同的正则语法,因此您的正则表达式并不总是有效。*

给定样本数据:

CREATE TABLE table_name (value) AS
SELECT 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum suscipit tortor non erat rhoncus, ac fermentum eros blandit. In hac habitasse platea dictumst. Vivamus ullamcorper tellus non nulla suscipit, et eleifend eros sagittis. Aenean iaculis eu mauris at egestas. Nullam ac interdum libero. In FORMA DE PRESENTACIÓN Y EMPAQUE: XXX; USO: volutpat venenatis ullamcorper. In tempus lorem vel turpis lacinia ultricies. In hac habitasse platea dictumst. Ut eleifend nulla magna, ut malesuada quam dapibus vitae. Mauris et molestie libero.' FROM DUAL;


然后:

SELECT REGEXP_SUBSTR(
         value,
         '^.*?(FORMA\sDE\sPRESENTACI[OÓ]?N\sY\sEMPAQUE([/[:space:]]+PRESENTACI[OÓ]N\sCOMERCIAL)?[:[:space:]A-Za-zÀ-ÿ,0-9;\.%*\t\-]+[,;]\s)U.*$',
         1,
         1,
         NULL,
         1
       ) AS match
FROM   table_name;


输出:
| MATCH |
| ------------ |
| XXX; XXX; |
fiddle

相关问题