我不是正则表达式的专家,在oracle中我想使用regexp_replace oracle函数在文本中找到一个字符串。
要查找的字符串开头有一个" {"最后一个"}"。
介于" {"和"}",你会找到字母和" _"字符。
所以,如果我有这个文字:
这是替换
的{HI_FRIEND}测试
如何删除字符串" {HI_FRIEND}"?
我试过了:
select REGEXP_REPLACE('this is a {HI_FRIEND} test to replace','*{(A-Z-)}*','') from dual
但它不起作用。
包含文本的字段位于至少包含1百万条记录的表中。
答案 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
/
删除旧表,重建任何约束索引,重新统计数据,然后你就可以了。这比更新要快得多。