#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()):