如何使用 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】:

您可以尝试/[^(&lt;.br&gt;)]*Closed\s?&lt;\.br&gt;/ 匹配,然后将其替换为'' 希望对你有帮助

【讨论】:

问题标记为 SQL 和 Oracle。正斜杠是怎么回事?这看起来很像sed 之类的,一点也不像Oracle SQL。此外,您认为[^(&lt;.br&gt;)] 是什么意思?它的意思是“除了左括号、小于号、句点、小写字母 b、小写字母 r、大于号或右括号之外的任何单个字符”。你以为是这个意思吗?

以上是关于如何使用 REGEXP_REPLACE 检查字符串中是不是存在值“已关闭”并替换的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Hive 中使用 regexp_replace() 一次删除多个字符?

如何在 Oracle 中使用 REGEXP_REPLACE 删除单词

如何使用 REGEXP_REPLACE

如何 REGEXP_REPLACE 特殊字符

如何使用 regexp_replace 仅替换捕获组而不是完整匹配字符串

使用 regexp_replace 如何用异常替换字符串