【问题标题】:regex_replace string betweenregex_replace 之间的字符串
【发布时间】:2017-06-02 05:51:55
【问题描述】:

我不是正则表达式方面的专家,在 oracle 中我想使用 regexp_replace oracle 函数在文本中查找字符串。

要查找的字符串以“{”开头,以“}”结尾。
在“{”和“}”之间,您会发现字母和“_”字符。

所以,如果我有这样的文字:

这是一个要替换的 {HI_FRIEND} 测试

如何删除字符串“{HI_FRIEND}”?

我试过了:

select REGEXP_REPLACE('this is a {HI_FRIEND} test to replace','*{(A-Z-)}*','') from dual

但它不起作用。

包含文本的字段在至少有 100 万条记录的表中。

【问题讨论】:

  • 如果我有一个像'something {123} something else' 这样的字符串怎么办?我应该删除它还是不删除它?
  • 就我而言,我必须删除“{”和“}”之间的所有字符。你的第一个例子很完美,因为替换了完整的内容。

标签: oracle regexp-replace


【解决方案1】:

试试这个:

select REGEXP_REPLACE('this is a {HI_FRIEND} test to replace','{(.*?)}') from dual

这将替换由{} 包裹的字符串,无论其内容如何。

惰性运算符 (?) 用于避免出现多个包装字符串时出现问题。

例如:

select REGEXP_REPLACE('this is a {HI_FRIEND} test to {HI_FRIEND} replace','{(.*)}') from dual

给予

this is a  replace

虽然我们有惰性运算符:

select REGEXP_REPLACE('this is a {HI_FRIEND} test to {HI_FRIEND} replace','{(.*?)}') from dual

结果:

this is a  test to  replace

如果您只想删除由大写字母和“_”组成的包裹字符串,您可以将(.*?) 编辑为([A-Z_]*?)

select REGEXP_REPLACE('this is a {HI_FRIEND} test to {123} replace','{([A-Z_]*?)}') from dual

将给予:

this is a  test to {123} replace

【讨论】:

    【解决方案2】:

    regex101.com 是一个很棒的正则表达式工具,因为我自己也经常遇到这些问题

    您可以输入您的正则表达式和您的示例数据并查看匹配的内容,它还会以简单的英文显示正则表达式正在寻找的内容,并提供语法参考。

    试试下面的正则表达式{([A-Z_])*}

    它几乎完全匹配 {},但随后匹配字符类 [A-Z_](大写 A 到大写 Z 或下划线)* 次(介于 0 和无限次之间)。

    【讨论】:

      【解决方案3】:

      我怀疑您的问题不在于使用正则表达式,而在于尝试更新 100 万行。我建议您使用发布的 REGEXP 答案创建一个包含所需数据的新表。比如……

      create table new_table
      as
      select * from old_table
      where 1=2
      /
      

      然后您可以选择通过使用直接路径加载和并行性来加快速度

      alter session enable parallel dml;
      
      insert /*+ append */ into new_table( col1, col2, text_col, ... )
      select col1, col2, REGEXP_REPLACE(...), ... )
      from old_table
      ;
      

      删除旧表,重建所有约束索引,重新收集统计信息,一切顺利。这将比更新快得多。

      【讨论】:

      • OP 没有说明他遇到了性能问题,并且提供的解决方案假定他具有 DDL 权限。
      • @MigsIsip。你是对的。但是,OP 确实声明他在表中至少有 1M 行。如果问题与字符串替换有关,那么这个事实就无关紧要了。因此,我为 OP 和其他读者提供了我认为有用的信息。如果这不适用,那很好;希望它对将来的某人有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多