【问题标题】:REGEXP_REPLACE to remove list of words from company name columnREGEXP_REPLACE 从公司名称列中删除单词列表
【发布时间】:2016-02-11 16:48:13
【问题描述】:
select 'Owens 1245 Coning COM CO LTD INC CORP INC', REGEXP_REPLACE(
      UPPER(TRIM(REGEXP_REPLACE(TRIM(REGEXP_REPLACE(regexp_replace('Owens 1245 Coning COM CO LTD', '(*[[:punct:]])', ' '),'(\s[0-9]+\s)|(^[0-9]+\s)|(\s[0-9]+$)',' ')),'( ){2,}', ' '))), 
      '\\b'||'CO|LTD|INC|CORP'||'\\W'
      ,'') CLEARTEXT
from dual;  

如果我运行上述查询,它会删除除“CO”之外的所有停用词并给出输出:OWENS CONING COM CO

但是我需要输出类似于:OWENS CONING COM

【问题讨论】:

  • 您可能需要添加另外几个具有预期输出的示例来阐明要求。什么是停用词?
  • 您的选择中有太多替换,这意味着规则数量相同或更多。因此,请添加您的替换语句的规则,以便我们提供帮助!
  • 抱歉,我的要求不明确
  • 抱歉,我的要求不明确。规则是:- 1)用“空格”替换所有标点符号(特殊字符)。 2) 删除所有数字词(仅数字词)。 3) 从名称中删除所有停用词,停用词列表 (CO|LTD|INC|CORP) 是用户定义的,来自与 (Pipe |) 连接的表。

标签: sql oracle regexp-replace


【解决方案1】:

试试这个,但一定要测试列中可能存在的“停用词”和“好”数据的每个组合。此正则表达式查找您的“停用词”,其后跟一个空格或行尾(空格已被占用)并替换为空。我添加了括号以显示在最终的 TRIM()) 之后没有空格:

SQL> with tbl(str) as (
     select 'Owens 1245 Coning COM CO LTD. INC CORP. INC' from dual
   )
   select str original, '[' || trim(regexp_replace(upper(str), '(\d+|CO|LTD|INC|CORP)([[:punct:]])?( |$)', '')) || ']' CLEARTEXT
   from tbl;

ORIGINAL
-----------------------------------------
CLEARTEXT
--------------------------------------------------------------------------------
Owens 1245 Coning COM CO LTD. INC CORP. INC
[OWENS CONING COM]


SQL>

编辑:修改正则表达式以允许在停用词后使用可选标点符号。

【讨论】:

    【解决方案2】:
    with t as 
    (
    select '121 R.S. Hughes3 Company, Inc.' SUPPLIER_NAME from dual
    )
    select a.SUPPLIER_NAME , REGEXP_REPLACE(
          REGEXP_REPLACE(UPPER(TRIM(REGEXP_REPLACE(TRIM(REGEXP_REPLACE(regexp_replace(a.SUPPLIER_NAME , '(*[[:punct:]])', ' '),'(\s[0-9]+\s)|(^[0-9]+\s)|(\s[0-9]+$)',' ')),'( ){2,}', ' '))), ''),
      '(CO|LTD|INC|CORP)?( |$)'
      ,' ') CLEARTEXT
    from t a
    ;
    

    谢谢加里 试图更改原始查询,其中我只添加了您提供的停用词查询,这给了我所需的输出。

    再次感谢。

    【讨论】:

    • 抱歉,我的要求不明确。规则是:- 1)用“空格”替换所有标点符号(特殊字符)。 2) 删除所有数字词(仅数字词)。 3) 从名称中删除所有停用词,停用词列表 (CO|LTD|INC|CORP) 是用户定义的,来自与 (Pipe |) 连接的表。
    • 所有这些嵌套调用不仅成本高昂,而且是维护的噩梦。我强烈建议您简化,以免您的名字被该代码的未来维护者诅咒。反而化繁为简,为后人所称道!在当前状态下,这不会通过良好的代码审查。我并不是要严厉,只是想在坏习惯开始之前改掉它。 :-)
    猜你喜欢
    • 2017-02-24
    • 2013-10-06
    • 2021-12-29
    • 1970-01-01
    • 2019-06-03
    • 2018-09-28
    • 2020-11-01
    • 2016-01-19
    • 1970-01-01
    相关资源
    最近更新 更多