软件: Oracle SQL
我有一个正则表达式REGEXP_SUBSTR(M.ENDPOINTAPPLICATIONNAME,'[^\s]*.exe',1,1,'i')
成功匹配
EXCEL.EXE
至EXCEL.EXE
Dropbox.exe
至Dropbox.exe
1-2-3-4-hike.exe
至1-2-3-4-hike.exe
shish boom bah.exe
至bah.exe
但我也想比赛
MS Outlook
至MS Outlook
Oracle Regex中的OR
语句是什么,如果找不到[^\s]*.exe
,它会选择所有文本?
这就是我所拥有的(但不起作用)
REGEXP_SUBSTR(M.ENDPOINTAPPLICATIONNAME,'([^\s]*.exe)'|('.'),1,1,'i')
答案 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]
相同。