regex_replace 之间的字符串

regex_replace string between

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

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

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

this is a {HI_FRIEND} test to replace

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

我试过这个:

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

但它不起作用。

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

试一试:

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

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

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

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

它完全匹配{},但是字符class [A-Z_](大写A到大写Z或下划线)*次(在 0 到无限次之间)。

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

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
;

删除旧的 table,重建任何约束索引,重新收集统计数据,一切顺利。这将比更新快得多。