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,重建任何约束索引,重新收集统计数据,一切顺利。这将比更新快得多。
我不是正则表达式方面的专家,在 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,重建任何约束索引,重新收集统计数据,一切顺利。这将比更新快得多。