【问题标题】:Need regular expression to replace all things inside string需要正则表达式来替换字符串中的所有内容
【发布时间】:2021-06-30 06:31:22
【问题描述】:

我在下面使用它工作正常,但我需要添加一个表达式来替换任何东西(如特殊字符、数字等所有东西应该涵盖目前我使用的 [A-Z])

select regexp_replace('002 - KLAMPFER - Sy 52-5-5+L', '- [A-Z]+ -', '- XXXXXXX -')
  from dual;

输出:

002 - XXXXXXX - Sy 52-5-5+L

但在输入字符串中,我们可能会得到特殊字符、数字、空格、德语特殊字符而不是“KLAMPFER”字符串,所以我需要涵盖所有这些的正则表达式。

【问题讨论】:

  • 你的预期输出是什么?
  • 'Anything' 包括 Space 和 -?这不是很明显,这可能有问题吗?
  • @anubhava 它不适用于空间
  • 然后试试这个:regex: ' - .+? - '

标签: sql regex


【解决方案1】:

对于任何支持非固定的正则表达式引擎,您都可以使用

(?<=^\S+\s+-\s(?:(?!\s+-\s).)*)\S

请参阅regex demo。 详情:

  • (?&lt;=^\S+\s+-\s(?:(?! - ).)*) - 与紧接在其前面的位置相匹配的正向后视
    • ^ - 字符串开头
    • \S+ - 一个或多个非空白字符
    • \s+-\s - 一个或多个空格,- 和一个空格
    • (?:(?!\s+-\s).)* - 除换行符以外的任何字符,尽可能多地出现,而不是开始“一个或多个空格、- 和一个空格”序列
  • \S - 任何非空白字符。

【讨论】:

    【解决方案2】:

    正如我所料,您会发现 Redshift 正则表达式引擎并不像您希望的那样完全可配置。我认为这与它何时从 Postgres 分叉有关,但“为什么”并不重要。在这种情况下,我发现简化是获得成功的最佳途径。 (“是的”,缺少正则表达式的完整功能是一件痛苦的事。也许有人知道让 Redshift 做我们想做的所有事情的魔力。)

    这是一个 KISS 方法:

    select regexp_substr(txt, '^[^-]*') || regexp_replace(regexp_substr(txt, ' - ([^-]*) - '), '[^\\s-]', 'X') || regexp_replace(txt, '^[^-]* - [^-]* - (.*)$', '$1')
    from (
    
    select '002 - KLAMPFER - Sy 52-' as txt
    union select '002 - DFTF GTFL - Ty 52-5-5+L'
    union select '002 - AMPFER TT OT - Vy 5-5+L'
    union select '002 - AMP 3>?> - Ty 52-5-5'
    );
    

    现在,如果您确定下一个分隔符 ' - ' 不会在文本中出现 3 次(上面的代码没有假设这一点),那么这更简单(使用 split_part()):

    select split_part(txt, ' - ', 1) || ' - ' ||  
        regexp_replace(split_part(txt, ' - ', 2), '[^\\s]', 'X') || ' - ' ||
        split_part(txt, ' - ', 3) 
    from (
    
    select '002 - KLAMPFER - Sy 52-' as txt
    union select '002 - DFTF GTFL - Ty 52-5-5+L'
    union select '002 - AMPFER TT OT - Vy 5-5+L'
    union select '002 - AMP 3>?> - Ty 52-5-5'
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多