如何使用 REGEXP_REPLACE 检查字符串中是不是存在值“已关闭”并替换
Posted
技术标签:
【中文标题】如何使用 REGEXP_REPLACE 检查字符串中是不是存在值“已关闭”并替换【英文标题】:How to use REGEXP_REPLACE to check if a value 'Closed' is present in the string and replace如何使用 REGEXP_REPLACE 检查字符串中是否存在值“已关闭”并替换 【发布时间】:2019-12-04 00:44:51 【问题描述】:我有以下情况。
周一上午 8:30 至下午 6:00 <.br> 周二休息 <.br> 周三上午 8:30 至下午 6:00
这里星期二休息。所以我需要从字符串 '<.br>Tuesday Closed' 中排除以下值并生成为:
周一上午 8:30 至下午 6:00 <.br> 周三上午 8:30 至下午 6:00
尝试使用 REGEXP_REPLACE(OfficeHrs,'Closed',' ') 只会发出 Closed 部分,但不确定如何忽略字符串中的 <.br>
【问题讨论】:
文本总是在字符串的中间吗?模式总是一样的吗? 模式相同。日子可以改变。任何一天都可以关闭。 【参考方案1】:你最好使用regexp_substr()
而不是regexp_replace()
,并使用instr()
、regexp_count()
作为辅助函数,并在最后连接listagg()
:
with tab as
(
select 'Monday 8:30 a.m. to 6:00 p.m.
Tuesday Closed
Wednesday 8:30 a.m. to 6:00 p.m' as str from dual
), t1 as
(
select regexp_substr(str,'^.*$',1,level,'m') as str, level as lvl
from tab
connect by level <= regexp_count(str,chr(10)) + 1
)
select listagg(str,chr(10)) within group (order by lvl) as "Result String"
from t1
where instr(str,'Closed')=0;
Result String
---------------------------------
Monday 8:30 a.m. to 6:00 p.m.
Wednesday 8:30 a.m. to 6:00 p.m
Demo
【讨论】:
【参考方案2】:你可以试试这个:
with tab as(
select 'Monday 8:30 a.m. to 6:00 p.m. <.br> Tuesday Closed <.br> Wednesday 8:30 a.m. to 6:00 p.m.' as str from dual union all
select 'Monday 8:30 a.m. to 6:00 p.m. <.br> Tuesday Closed <.br> Wednesday 8:30 a.m. to 6:00 p.m. <.br> Thursday Closed <.br> Sunday 8:30 a.m. to 6:00 p.m.' as str from dual union all
select 'Monday 8:30 a.m. to 6:00 p.m. <.br> Tuesday Closed <.br> Wednesday Closed <.br> Sunday 8:30 a.m. to 6:00 p.m.' as str from dual
)
select regexp_replace(str,'> [[:alpha:]]* Closed <.br')
from tab;
| REGEXP_REPLACE(STR,'>[[:ALPHA:]]*CLOSED<.br :------------------------------------------------> 周三上午 8:30 至下午 6:00 | |周一上午 8:30 至下午 6:00 <.br> 周三上午 8:30 至下午 6:00 <.br> 周日上午 8:30 至下午 6:00 | |周一上午 8:30 至下午 6:00 <.br> 周日上午 8:30 至下午 6:00 |
db小提琴here
【讨论】:
谢谢,这按预期工作 regexp_replace(str,'<.br>[[:alpha:]]* Closed') 这行得通,只要 <.br> 是唯一可能的标签……而且只要“营业结束”的日子不是第一天或最后一天列表中的日期。 @mathguy 这是真的。由于模式总是相同的,这应该不是问题【参考方案3】:您可以尝试/[^(<.br>)]*Closed\s?<\.br>/
匹配,然后将其替换为''
希望对你有帮助
【讨论】:
问题标记为 SQL 和 Oracle。正斜杠是怎么回事?这看起来很像sed
之类的,一点也不像Oracle SQL。此外,您认为[^(<.br>)]
是什么意思?它的意思是“除了左括号、小于号、句点、小写字母 b、小写字母 r、大于号或右括号之外的任何单个字符”。你以为是这个意思吗?以上是关于如何使用 REGEXP_REPLACE 检查字符串中是不是存在值“已关闭”并替换的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Hive 中使用 regexp_replace() 一次删除多个字符?
如何在 Oracle 中使用 REGEXP_REPLACE 删除单词