在Oracle中从字符串中删除文本

vs3odd8k  于 2023-04-20  发布在  Oracle
关注(0)|答案(2)|浏览(122)

我有一个2列的表。(第2列基本上是多个电子邮件的追加列表)
| 卡塞德|文本|
| --------------|--------------|
| 一百零一|来自:ABHI RATHI〈(〉〈〈)〉ABHIRATHI@XYZ.COM〉发送:2022年6月17日,星期五,下午12:33至:VR,SARATH〈(〉〈〈)〉SARATH.VR@ABC.COM〉;主题:回复:日志编号20092017656:[安全小组确认存在可疑活动] [所需措施]来自:YUAN LN〈(〉〈〈)〉YIQUANLIN@XYZ.COM〉发送:2022年6月10日,星期五,下午3:40至:VR,SARATH〈(〉〈〈)〉SARTH.VIR@ABC.COM〉SINGH,ROHINI〈(〉〈〈)〉ROSHINI.SINGH@PQR.COM〉主题:回复:日志编号20092017656:你好,对不起,我今天休假,所以回复晚了,下周一能给我打个电话吗?|
所需输出:
| 案例ID|文本|
| --------------|--------------|
| 一百零一|主题:回复:日志编号20092017656:[安全小组确认有可疑活动] [需要采取的行动]主题:回复:日志编号20092017656:你好,对不起,我今天休假,所以回复晚了,下周一能给我打个电话吗?|
从'FROM:'删除到'subject'之前的'〉'。只保留内容并删除不必要的文本
我试过这个:

with test as
(
 select 'FROM: ABHI RATHI <(><<)>ABHIRATHI@XYZ.COM> SENT: FRIDAY, JUNE 17, 2022 12:33 PM TO: VR, SARATH <(><<)>SARATH.VR@ABC.COM>; SUBJECT: RE: LOG # 20092017656 : [ SECURITY TEAM IDENTIFY THERE IS SUSPICION ACTIVITY ] [ ACTIONS REQUIRED ] FROM: YUAN LN <(><<)>YIQUANLIN@XYZ.COM> SENT: FRIDAY, JUNE 10, 2022 3:40 PM TO: VR, SARATH <(><<)>SARTH.VIR@ABC.COM> SINGH, ROHINI <(><<)>ROSHINI.SINGH@PQR.COM>SUBJECT: RE: LOG # 20092017656 : HI SARTH SORRY FOR THE LATE REPLY AS I AM ON LEAVE TODAY CAN WE HAVE A CALL NEXT MONDAY? THANKS AND REGARDS YUAN' as text from dual
 )
select regexp_replace(text, 'FROM:[[:print:]]*[\.][a-zA-Z]{2,4}[\>]','' )
from test

得到输出:
主题:回复:日志编号20092017656:你好,对不起,我今天休假,所以回复晚了,下周一能给我打个电话吗?
问题:缺少第一封电子邮件的内容。
所需输出:
主题:回复:日志编号20092017656:[安全小组确认存在可疑活动] [所需措施]主题:回复:日志编号20092017656:你好,对不起,我今天休假,所以回复晚了,下周一能给我打个电话吗?

2fjabf4q

2fjabf4q1#

您可以在FROMSUBJECT之间使用非贪婪(用问号表示)匹配,并将此匹配替换为SUBJECT

with sample(caseid, val) as (
  select 101, q'^FROM: ABHI RATHI <(><<)>ABHIRATHI@XYZ.COM> SENT: FRIDAY, JUNE 17, 2022 12:33 PM TO: VR, SARATH <(><<)>SARATH.VR@ABC.COM>; SUBJECT: RE: LOG # 20092017656 : [ SECURITY TEAM IDENTIFY THERE IS SUSPICION ACTIVITY ] [ ACTIONS REQUIRED ] FROM: YUAN LN <(><<)>YIQUANLIN@XYZ.COM> SENT: FRIDAY, JUNE 10, 2022 3:40 PM TO: VR, SARATH <(><<)>SARTH.VIR@ABC.COM> SINGH, ROHINI <(><<)>ROSHINI.SINGH@PQR.COM>SUBJECT: RE: LOG # 20092017656 : HI SARTH SORRY FOR THE LATE REPLY AS I AM ON LEAVE TODAY CAN WE HAVE A CALL NEXT MONDAY? THANKS AND REGARDS YUAN^'
  from dual
)
select
  caseid
  , regexp_replace(val, 'FROM.+?(SUBJECT)', '\1') as replaced
  , val
from sample
CASEID更换瓦尔
一百零一主题:回复:日志编号20092017656:[安全小组确认存在可疑活动] [所需措施]主题:回复:日志编号20092017656:你好,对不起,我今天休假,所以回复晚了,下周一能给我打个电话吗?来自:ABHI RATHI〈(〉〈〈)〉ABHIRATHI@XYZ.COM〉发送:2022年6月17日,星期五,下午12:33至:VR,SARATH〈(〉〈〈)〉SARATH.VR@ABC.COM〉;主题:回复:日志编号20092017656:[安全小组确认存在可疑活动] [所需措施]来自:YUAN LN〈(〉〈〈)〉YIQUANLIN@XYZ.COM〉发送:2022年6月10日,星期五,下午3:40至:VR,SARATH〈(〉〈〈)〉SARTH.VIR@ABC.COM〉SINGH,ROHINI〈(〉〈〈)〉ROSHINI.SINGH@PQR.COM〉主题:回复:日志编号20092017656:你好,对不起,我今天休假,所以回复晚了,下周一能给我打个电话吗?

fiddle
但是您的示例数据在最后一个>SUBJECT之间有额外的标点符号(第一次出现时为分号,最后一次出现时为空),因此您可能需要为允许的字符集提供额外的匹配模式。

fhity93d

fhity93d2#

我不知道 Oracle 的正则表达式引擎能做什么,但如果它处理正lookaheads和组,那么我会使用以下模式:

/\s*\bFROM:.*?(?=\bSUBJECT:)(.*?)(?=\s\bFROM:|$)/gi

替换为$1.,以便将主体放回,并在其后面添加最后一个点。
你可以在这里测试:https://regex101.com/r/Wi19AK/1
现在,如果这个在Oracle上不起作用,那么你可以尝试删除FROM: ...部分。但是,由于你并不总是用>来完成字段,你仍然需要捕获SUBJECT:并将其放回。但是这样你就不会使用lookahead:

/\s*\bFROM:.*?\bSUBJECT:/gi

但是使用这个更简单的模式,你不需要解决你想在每个主题后面添加的点。在这里查看它的操作:https://regex101.com/r/Wi19AK/2
要理解模式本身,请查看regex 101上的链接,因为它们在右侧给予了我们一个很好的解释。

编辑 Oracle

由于 Oracle 也不处理\b(对于这样一个众所周知的数据库引擎来说,这相当令人惊讶),你将不得不使用它。它不太精确,但应该可以,因为这些单词后面跟着:字符,所以可能不会出现在你的其余内容中。

搜索\s*FROM:(.*?)SUBJECT:并替换为. SUBJECT:
在这里测试:https://regex101.com/r/Wi19AK/4
然后,您必须通过第二次搜索删除第一个点和空格-用^\.\s替换为模式和空替换。
在SQL中:

regexp_replace(
  regexp_replace(
    val,
    '\s*FROM:(.*?)SUBJECT:',
    '. SUBJECT:'
  ),
  '^\.\s',
  ''
)
AS corrected_val

相关问题