Postgre регулярное выражение заменить - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь очистить текстовые поля от тегов html с помощью регулярных выражений.

Этот запрос работает как ожидалось

select REGEXP_REPLACE('<span>foobar</span><span><br><br></span>', '<.*?>', ' ', 'g') 

, возвращая 'foobar', но добавляя вариант для других типов тегов

select REGEXP_REPLACE('<span>foobar</span><span><br><br></span>', '<.*?>|&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-f]{1,6})', ' ', 'g') 

возвращает пустую строку.

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

1 Ответ

2 голосов
/ 22 апреля 2020

Вы смешиваете жадные и не жадные квантификаторы по одному и тому же шаблону в альтернативах на одном и том же уровне вложенности, это часто приводит к неоднозначному поведению с Postre SQL regex.

Используйте жадные квантификаторы, <.*?> можно безопасно заменить на <[^>]*> или <[^<>]*>:

select REGEXP_REPLACE(
    '<span>foobar</span><span><br><br></span>', 
    '<[^<>]*>|&([a-z0-9]+|#[0-9]{1,6}|#x[0-9a-f]{1,6})', ' ', 'g')
      ^^^^^^

См. PostgreSQL demo , в результате чего

enter image description here

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