【问题标题】:Oracle split message with regexp_substrOracle 使用 regexp_substr 拆分消息
【发布时间】:2017-10-08 21:20:45
【问题描述】:

我需要拆分消息:

 500 Oracle Parkway.Redwood Shores.*.=13

现在我对 Substr1/2/4 有了一些可行的解决方案

  SELECT '500 Oracle Parkway.Redwood Shores.*.=13' string1,
  REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','.[^.]+') 
  "SUBSTR1" ,
  replace(REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+
  [^.]+'),'.',null) "SUBSTR2" ,
  REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+.[$.]+[^.]') 
  "SUBSTR3" ,
  REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[^=]+$') 
  "SUBSTR4" 
  FROM DUAL;

但是 Substr3 包含“=”。我希望至少有 '.*.'或'*'

您能否给我一个提示,如何在正则表达式中“排除”任何字符(例如 '=')?

非常感谢任何帮助!

谢谢

已解决见 SUBSTR3.1

      SELECT
     '500 Oracle Parkway.Redwood Shores.*.=13' string1,
      REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','.[^.]+') 
      "SUBSTR1" ,
      replace(REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+
      [^.]+'),'.',null) "SUBSTR2" ,
      REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[$.]+.[$.]+
      [^.]') "SUBSTR3" ,
      REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[^.]+',1,3) 
      "SUBSTR3.1" ,
      REGEXP_SUBSTR('500 Oracle Parkway.Redwood Shores.*.=13','[^=]+$') 
      "SUBSTR4" 
      FROM DUAL;

【问题讨论】:

  • 您明确地将=(或.*. 之后的任何字符)包含在模式的最后部分[^.] 中。因此,只需将其删除即可快速修复。但是,更多地解释您正在尝试做的事情,并提供更多示例源字符串以及您尝试为所有这些字符串实现的输出,这将是有帮助的。 substr2 在您的示例中为空。您是否真的要对字符串进行标记,然后他们(可能)从最终标记中删除 =

标签: oracle regexp-substr regexp-like


【解决方案1】:

非常尊重 Alex Poole,如果列表中的某个元素缺失,则格式为 '[^.]+' 的正则表达式会失败。它将默默地返回不正确的数据。请改用此表格。请注意,我从第一个示例中删除了城市。试试看,你可能会感到惊讶:

with t (str) as (
  select '500 Oracle Parkway..*.=13' from dual union 
  select 'One Microsoft Way.Redmond.Washington.=27' from dual
)
select str,
  regexp_substr(str, '(.*?)(\.|$)', 1, 1, NULL, 1) as substr1,
  regexp_substr(str, '(.*?)(\.|$)', 1, 2, NULL, 1) as substr2,
  regexp_substr(str, '(.*?)(\.|$)', 1, 3, NULL, 1) as substr3,
  ltrim(regexp_substr(str, '(.*?)(\.|$)', 1, 4, NULL, 1), '=') as substr4
from t;

查看这里了解更多信息:Split comma separated values to columns in Oracle

【讨论】:

    【解决方案2】:

    您似乎正在尝试根据句点对源字符串进行标记,并且它们(可能)从第四个标记中删除了前导等号。您用于“substring3.1”的解决方案可用于所有这些:

    with t (str) as (
      select '500 Oracle Parkway.Redwood Shores.*.=13' from dual
      union all select 'One Microsoft Way.Redmond.Washington.=27' from dual
    )
    select str,
      regexp_substr(str, '[^.]+', 1, 1) as substr1,
      regexp_substr(str, '[^.]+', 1, 2) as substr2,
      regexp_substr(str, '[^.]+', 1, 3) as substr3,
      ltrim(regexp_substr(str, '[^.]+', 1, 4), '=') as substr4
    from t;
    
    STR                                      SUBSTR1              SUBSTR2              SUBSTR3    SUBSTR4
    ---------------------------------------- -------------------- -------------------- ---------- -------
    500 Oracle Parkway.Redwood Shores.*.=13  500 Oracle Parkway   Redwood Shores       *          13     
    One Microsoft Way.Redmond.Washington.=27 One Microsoft Way    Redmond              Washington 27     
    

    【讨论】:

    • @Alex Poole 对不起,Alex。 :-) 自从我在生产报告中发现我的帖子中提到的错误以来,我一直致力于让人们停止使用'[^.]+' 字符串解析正则表达式格式。从那以后,我将代码封装到一个实用函数中,开发人员可以在其中传递一个字符串和他们想要的元素的编号,然后该函数返回元素,为简单起见完全隐藏了正则表达式。我在这里的某个地方发布了它。和我一起传播这个词!
    • @Gary_W - 我记得以前被抚养过,但这种模式太常见了,我忘记寻找更安全的模式(或者我太懒了,如果我认为这可能无关紧要......好像在这里)。我已将您现在链接到的答案添加为书签 *8-)
    猜你喜欢
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多