regex_replace之间的字符串

时间:2017-01-18 00:32:19

标签: oracle regexp-replace

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

要查找的字符串开头有一个" {"最后一个"}"。
介于" {"和"}",你会找到字母和" _"字符。

所以,如果我有这个文字:

  

这是替换

的{HI_FRIEND}测试

如何删除字符串" {HI_FRIEND}"?

我试过了:

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

但它不起作用。

包含文本的字段位于至少包含1百万条记录的表中。

3 个答案:

答案 0 :(得分:2)

尝试一下:

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

答案 1 :(得分:0)

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

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

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

它与{}匹配,但随后是字符[A-Z_](资本A到资本Z或下划线)*次(0到无限次)

答案 2 :(得分:-1)

我怀疑你的问题不是使用正则表达式,而是尝试更新100万行。我建议您使用发布的REGEXP答案创建一个包含所需数据的新表。有点像...

textTab

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

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

删除旧表,重建任何约束索引,重新统计数据,然后你就可以了。这比更新要快得多。