Oracle SQL Regex оператор OR - PullRequest
0 голосов
/ 15 мая 2019

ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ: 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

Что такое оператор OR в Oracle Regex, который выбирает весь текст, если [^\s]*.exe не найден?

Это то, что яесть (но не работает)

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

1 Ответ

2 голосов
/ 15 мая 2019

| должно быть внутри строки регулярного выражения, вы не должны заканчивать строку.

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].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...