Проблема с использованием команды regexp_replace - PullRequest
0 голосов
/ 02 ноября 2019

Используемая текущая команда:

regexp_replace(b.DOWNCASE_NAME, '[^\w\s]', '', 'g') as CONDITION_NAME_DC

Это изменит "опухоль клетки Сертоли-Лейдига яичника" на "опухоль клетки Сертолилидайга яичника". Это также изменит "наследственный рак молочной железы / яичников (brca1, brca2)" на "наследственный рак яичников молочной железы brca1 brca2".

Я не понимаю, почему он удаляет черту в "sertoli-leydig" иположить его в одно слово вместо того, чтобы держать пробел между ними. В regexp_replace, если я ставлю пробел в '' перед, 'g', тогда он также ставит двойной пробел в "наследственном раке яичника молочной железы brca1 brca2"

Мне не нужен двойной пробел,Я просто хочу там один пробел. Есть идеи, что тут делать?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2019

Ваш RE (Таблица 9-19. Сокращения сокращений классов регулярных выражений) говорит об удалении всего, что не входит в классы \ w или \ s. Теперь \ s - это просто пробел, и \ w поддерживает все буквенно-цифровые символы и символ подчеркивания (_), поэтому ваш RE не поддерживает ни тире (-), ни (/). Разверните RE, чтобы также сохранить эти символы:

with b (downcase_name) as
  (values ('ovarian sertoli-leydig cell tumor')
        , ('hereditary breast/ovarian cancer (brca1, brca2)')
  )
select downcase_name, regexp_replace(b.downcase_name, '[^\w\s\-/]', '', 'g') as name_dc
  from b; 
0 голосов
/ 02 ноября 2019

Я не понимаю, почему он удаляет черту в "sertoli-leydig" и помещает ее в одно слово вместо того, чтобы держать пробел между ними.

Потому что это то, чтоты сказал это делать. Зачем между ними ставить пробел, если вы сказали, что не стоит?

Замените пунктуацию пробелом, но запишите все пробелы, которые уже находятся вокруг пунктуации, чтобы они также заменялись этим единственным пробелом.

regexp_replace(b.DOWNCASE_NAME, ' *[^\w\s] *', ' ', 'g');
...