当一个字符串包含另一个字符串时找到两个字符串之一的正则表达式

时间:2019-01-29 05:15:21

标签: regex string postgresql

将在PostgreSQL中使用。 我有一组字符串,例如:

xxx Heartbeat
yyy Heartbeat
xxx Code Red Entry/Exit
yyy Code Red Entry/Exit
xxx TFTP Server Heartbeat
yyy TFTP Server Heartbeat

我需要将第二部分拆分为未知字符串xxx / yyy之后,其中可以有空格。在我找到不交叉的搜索字符串并使用以下类型之前:

SUBSTRING(description, '(?i).*(Code Red Entry/Exit|TFTP Server Heartbeat).?')

但是在获得另一个(Heartbeat)选项之后,如果我使用此正则表达式,则在所有情况下都只会选择“ Heartbeat”

SUBSTRING(description, '(?i).*(Code Red Entry/Exit|TFTP Server Heartbeat|Heartbeat).?')

我该如何解决?

已更新。 基本上,我需要使用正则表达式替代下一个代码:

CASE WHEN description ILIKE '%TFTP Server Heartbeat' THEN 'TFTP Server Heartbeat' 
     WHEN description ILIKE '%Heartbeat' THEN 'Heartbeat' 
     WHEN description ILIKE '%Code Red Entry/Exit' THEN 'Code Red Entry/Exit' 
 etc... 
END

2 个答案:

答案 0 :(得分:0)

尝试使用正则表达式,如下所示:

SELECT ARRAY_TO_STRING(REGEXP_MATCHES(description, '^\y(TFTP Server Heartbeat|Heartbeat|Code Red Entry/Exit)\y$', 'g'), '')
FROM yourTable
WHERE description ~ '\y(TFTP Server Heartbeat|Heartbeat|Code Red Entry/Exit)\y'

enter image description here

Demo

答案 1 :(得分:0)

也许我完全想念这条船,但听起来好像您只是想要匹配的字符串(如果它是这三个字符串之一)。

如果是这种情况,并且您使用的是正则表达式,那么简单的子字符串就无法正常工作吗?

select
  substring (description from 'TFTP Server Heartbeat|Code Red Entry/Exit|Heartbeat')

示例数据的结果:

Heartbeat
Heartbeat
Code Red Entry/Exit
Code Red Entry/Exit
TFTP Server Heartbeat
TFTP Server Heartbeat