Oracle SQL Regex OR语句

时间:2019-05-15 15:55:13

标签: sql regex oracle

软件: Oracle SQL


我有一个正则表达式REGEXP_SUBSTR(M.ENDPOINTAPPLICATIONNAME,'[^\s]*.exe',1,1,'i')成功匹配

EXCEL.EXEEXCEL.EXE

Dropbox.exeDropbox.exe

1-2-3-4-hike.exe1-2-3-4-hike.exe

shish boom bah.exebah.exe

但我也想比赛

MS OutlookMS Outlook

Oracle Regex中的OR语句是什么,如果找不到[^\s]*.exe,它会选择所有文本?

这就是我所拥有的(但不起作用)

REGEXP_SUBSTR(M.ENDPOINTAPPLICATIONNAME,'([^\s]*.exe)'|('.'),1,1,'i')

1 个答案:

答案 0 :(得分:2)

|必须在regexp字符串中,您不应该在字符串结尾。

REGEXP_SUBSTR(M.ENDPOINTAPPLICATIONNAME,'([^\s]*.exe)|(.)',1,1,'i')

但是.仅匹配单个字符,而不匹配整个字符串。您需要.*才能匹配所有内容。也不需要分组括号。

REGEXP_SUBSTR(M.ENDPOINTAPPLICATIONNAME,'[^\s]*.exe|.*',1,1,'i')

但是,这并不能真正做到您想要的。匹配正则表达式时,它将在输入字符串中查找第一个匹配项,而不是与正则表达式中的第一个替代项匹配的输入字符串部分。由于.*shish boom bah.exe匹配,它将返回整个字符串,而不仅仅是bah.exe

您需要使用CASE选择首选的替代方法:

CASE WHEN REGEXP_LIKE(M.ENDPOINTAPPLICATIONNAME, '\.exe', 'i')
     THEN REGEXP_SUBSTR(M.ENDPOINTAPPLICATIONNAME,'\S*\.exe',1,1,'i')
     ELSE M.ENDPOINTAPPLICATIONNAME
END

请注意,您还应在正则表达式中转义.,因为它通常是通配符。并且\S[^\s]相同。