Нужно регулярное выражение для замены всех вещей внутри строки

#sql #regex

Вопрос:

Я использую ниже, что работает нормально, но мне нужно добавить выражение, которое заменит что-либо (например, специальные символы, цифры и т. Д. Все, Что должно охватывать в настоящее время, я использовал [A-Z])

 select regexp_replace('002 - KLAMPFER - Sy 52-5-5 L', '- [A-Z]  -', '- XXXXXXX -')
  from dual;
 

выход:

 002 - XXXXXXX - Sy 52-5-5 L
 

но во входной строке мы можем получить специальные символы,число,пробелы,специальные символы немецкого языка вместо жала «КЛАМПФЕР», поэтому мне нужно регулярное выражение, которое охватит все это.

Комментарии:

1. Каков ваш ожидаемый результат?

2. «Что-нибудь», включая Пространство и - ? Разве не очевидно, что это может быть проблематично?

3. @anubhava Это не работает для пространств

4. Тогда попробуйте это: regex: ' - . ? - '

Ответ №1:

С помощью любого движка регулярных выражений, который поддерживает нефиксированные с помощью поиска, вы можете использовать

 (?<=^S s -s(?:(?!s -s).)*)S
 

Смотрите демонстрацию регулярных выражений. Подробные сведения:

  • (?<=^S s -s(?:(?! - ).)*) — положительный внешний вид, соответствующий местоположению, которому непосредственно предшествует
    • ^ — начало строки
    • S — один или несколько символов без пробелов
    • s -s — один или несколько пробелов - и пробел
    • (?:(?!s -s).)* — любой символ, отличный от символа разрыва строки, как можно больше вхождений, не начиная последовательность «один или несколько пробелов - и пробелов» .
  • S — любой символ без пробелов.

Ответ №2:

Как я и ожидал, вы обнаружите, что механизм регулярных выражений красного смещения не так полностью настраивается, как вам хотелось бы. Я думаю, что это связано с тем, когда он был разветвлен из Postgres, но «почему» не имеет значения. В этом случае я нахожу, что упрощение-лучший подход к достижению успеха. («Да», это отсутствие полной функциональности регулярных выражений-боль. Может быть, кто-то знает магию, позволяющую Красному смещению делать все, что мы хотим.)

Вот такой подход к ПОЦЕЛУЮ:

 select regexp_substr(txt, '^[^-]*') || regexp_replace(regexp_substr(txt, ' - ([^-]*) - '), '[^\s-]', 'X') || regexp_replace(txt, '^[^-]* - [^-]* - (.*)

Теперь, если вы уверены, что разделитель рядом " - " не будет отображаться 3 раза в тексте (приведенный выше код этого не предполагает), то это проще (с помощью split_part()):

 select split_part(txt, ' - ', 1) || ' - ' ||  
    regexp_replace(split_part(txt, ' - ', 2), '[^\s]', 'X') || ' - ' ||
    split_part(txt, ' - ', 3) 
from (

select '002 - KLAMPFER - Sy 52-' as txt
union select '002 - DFTF GTFL - Ty 52-5-5 L'
union select '002 - AMPFER TT OT - Vy 5-5 L'
union select '002 - AMP 3>?> - Ty 52-5-5'
);
 


, '$1')
from (

select '002 - KLAMPFER - Sy 52-' as txt
union select '002 - DFTF GTFL - Ty 52-5-5 L'
union select '002 - AMPFER TT OT - Vy 5-5 L'
union select '002 - AMP 3>?> - Ty 52-5-5'
);
Теперь, если вы уверены, что разделитель рядом » — » не будет отображаться 3 раза в тексте (приведенный выше код этого не предполагает), то это проще (с помощью split_part()):