Другой способ использования замены, доступный как в java
String text = "62591000756";
String patched = text.substring(0, 6) + "XXX" + text.substring(9);
, так и в sql . Это часть ansi-sql, поэтому она не зависит от вашей марки БД. Обратите внимание, sql использует индексирование на основе 1, java использует 0, java использует конечный индекс, sql длину подстроки.
Конкатенация строк («+») выполняется в sql с использованием CONCAT(также в стандарте Ansi) давая нам, давайте посмотрим ...
SELECT CONCAT(SUBSTRING(Fieldname, 1, 6), "XXX", SUBSTRING(Fieldname, 10, 2)) AS PATCHED FROM
Tablename;
Тогда версия регулярного выражения Java:
"62591000756".replaceAll("([0-9]{6})([0-9]{3})([0-9]{2})", "$1XXX$2")
Что касается версии sql, зависит от вашей базы данных. Некоторые заменяют регулярное выражение, oracle делает .
Если вы хотите сгенерировать это, чтобы учесть маски любой длины при любом индексе, с подходом регулярного выражения это под рукой: просто установите пользовательские значениядля чисел в регулярном выражении ({6} {3} {2}) что-то вроде String.format("([0-9]{%d})([0-9]{%d})([0-9]{%d})", lenghtPrefix, lengthMask, lengthPostfix)
. Обратите внимание, что при этом вы представите множество угловых случаев, например, индекс и длина маски должны находиться в диапазоне исходной строки.
Я уверен, что вы можете написать один sql, который может обрабатыватьэто, но это может стать сложным, или, так как вы используете Oracle, вы можете написать функцию plsql для работы, которая затем может быть использована в sql. Oracle также позволяет встраивать Java, но никогда не пробовал.