Я пытаюсь отфильтровать с помощью оракула SQL regexp_replace доменное имя из списка URL-адресов.Проблема в том, что некоторые из них имеют порты, а некоторые - нет.
В следующем примере the-super.hosting.com следует заменить на HOSTNAME (но не в жестком коде в регулярном выражении, поскольку это может быть что угодно)
WITH strings AS ( SELECT 'http://wwww11.the-super.hosting.com:9999/aPath/servlet?config=abcLoginNr=%1' s FROM dual union all SELECT 'http://wwww22.the-super.hosting.com:6666/aPath/servlet?config=abcLoginNr=%2' s FROM dual union all SELECT 'http://wwww22.the-super.hosting.com:6666/aPath/servlet?config=abcLoginNr=%2' s FROM dual union all SELECT 'http://wwww04.the-super.hosting.com/aPath/servlet?config#here' s FROM dual ) SELECT regexp_replace(s,'([[:alpha:]]+://[[:alpha:]]{4}[[:digit:]]{2}\.)(.+)(:9999/|:6666/|/?)(.+)', '\1HOSTNAME\3\4') "MODIFIED_STRING", s "STRING" FROM strings;
Кажется, что он не может обрабатывать порты как необязательные с обычным путем (поскольку там путь начинается напрямую). Можно ли по-разному сопоставить часть домена, чтобы всегда оставшиеся остатки былипуть с необязательным портом? есть ли способ заменить его одним оператором?
Я думаю, ты делаешь все более сложным, чем должно быть. Вам действительно нужно только три части; исходный протокол (все, что следует за ://) и префикс www??. (при условии, что он всегда присутствует); оставшуюся часть доменного имени удалить; и все, что осталось, что может включать, а может и не включать порт - но вам на самом деле все равно; так:
://
www??.
([^.]+\.)([^/:]+)(.*)
, где
([^.]+\.)
([^/:]+)
(.*)
А для замены вы хотите сохранить первую и третью части такими, какие они есть, и заменить вторую фиксированную HOSTNAME.
HOSTNAME
Итак, вы получите:
WITH strings AS ( SELECT 'http://wwww11.the-super.hosting.com:9999/aPath/servlet?config=abcLoginNr=%1' s FROM dual union all SELECT 'http://wwww22.the-super.hosting.com:6666/aPath/servlet?config=abcLoginNr=%2' s FROM dual union all SELECT 'http://wwww22.the-super.hosting.com:6666/aPath/servlet?config=abcLoginNr=%2' s FROM dual union all SELECT 'http://wwww04.the-super.hosting.com/aPath/servlet?config#here' s FROM dual union all SELECT 'http://wwww04.the-super.hosting.com' s FROM dual union all SELECT 'http://wwww04.the-super.hosting.com/' s FROM dual union all SELECT 'http://wwww04.the-super.hosting.com/aPath' s FROM dual union all SELECT 'http://wwww04.the-super.hosting.com:1234' s FROM dual union all SELECT 'http://wwww04.the-super.hosting.com:1234/' s FROM dual union all SELECT 'http://wwww04.the-super.hosting.com:1234/aPath' s FROM dual ) SELECT regexp_replace(s, '([^.]+\.)([^/:]+)(.*)', '\1HOSTNAME\3') "MODIFIED_STRING", s "STRING" FROM strings; MODIFIED_STRING STRING -------------------------------------------------------------- --------------------------------------------------------------------------- http://wwww11.HOSTNAME:9999/aPath/servlet?config=abcLoginNr=%1 http://wwww11.the-super.hosting.com:9999/aPath/servlet?config=abcLoginNr=%1 http://wwww22.HOSTNAME:6666/aPath/servlet?config=abcLoginNr=%2 http://wwww22.the-super.hosting.com:6666/aPath/servlet?config=abcLoginNr=%2 http://wwww22.HOSTNAME:6666/aPath/servlet?config=abcLoginNr=%2 http://wwww22.the-super.hosting.com:6666/aPath/servlet?config=abcLoginNr=%2 http://wwww04.HOSTNAME/aPath/servlet?config#here http://wwww04.the-super.hosting.com/aPath/servlet?config#here http://wwww04.HOSTNAME http://wwww04.the-super.hosting.com http://wwww04.HOSTNAME/ http://wwww04.the-super.hosting.com/ http://wwww04.HOSTNAME/aPath http://wwww04.the-super.hosting.com/aPath http://wwww04.HOSTNAME:1234 http://wwww04.the-super.hosting.com:1234 http://wwww04.HOSTNAME:1234/ http://wwww04.the-super.hosting.com:1234/ http://wwww04.HOSTNAME:1234/aPath http://wwww04.the-super.hosting.com:1234/aPath
Вы можете быть более точным в отношении формата протокола и т. Д., Но я не уверен, что есть много смысла.
Проблема с вашим исходным шаблоном - это сочетание жадности и необязательного слеша в качестве последнего компонента 'или' с номерами портов. Вы можете настроить его, чтобы он работал, по крайней мере, для ваших образцов данных, например ::
WITH strings AS ( SELECT 'http://wwww11.the-super.hosting.com:9999/aPath/servlet?config=abcLoginNr=%1' s FROM dual union all SELECT 'http://wwww22.the-super.hosting.com:6666/aPath/servlet?config=abcLoginNr=%2' s FROM dual union all SELECT 'http://wwww22.the-super.hosting.com:6666/aPath/servlet?config=abcLoginNr=%2' s FROM dual union all SELECT 'http://wwww04.the-super.hosting.com/aPath/servlet?config#here' s FROM dual ) SELECT regexp_replace(s,'([[:alpha:]]+://[[:alpha:]]{4}[[:digit:]]{2}\.)(.+?)(:9999/|:6666/|/)(.+)$', '\1HOSTNAME\3\4') "MODIFIED_STRING", s "STRING" -- ^ ^^^ ^ FROM strings; MODIFIED_STRING STRING -------------------------------------------------------------- --------------------------------------------------------------------------- http://wwww11.HOSTNAME:9999/aPath/servlet?config=abcLoginNr=%1 http://wwww11.the-super.hosting.com:9999/aPath/servlet?config=abcLoginNr=%1 http://wwww22.HOSTNAME:6666/aPath/servlet?config=abcLoginNr=%2 http://wwww22.the-super.hosting.com:6666/aPath/servlet?config=abcLoginNr=%2 http://wwww22.HOSTNAME:6666/aPath/servlet?config=abcLoginNr=%2 http://wwww22.the-super.hosting.com:6666/aPath/servlet?config=abcLoginNr=%2 http://wwww04.HOSTNAME/aPath/servlet?config#here http://wwww04.the-super.hosting.com/aPath/servlet?config#here
но это похоже на излишество.