Я предлагаю упростить решение до одного replaceAll
вызова, который заменит все встроенные совпадения и не вызовет никаких проблем, как у вас:
statement = statement.replaceAll("length\\(([a-zA-Z]+)\\)", "LEN($1)");
См. regex и Демонстрационная версия Java .
String s = "select *,length(devise) lendevise,length(marche) lenmarche,length(nature) lennature from tableX where nseq='0'";
System.out.println(s.replaceAll("length\\(([a-zA-Z]+)\\)", "LEN($1)"));
// => select *,LEN(devise) lendevise,LEN(marche) lenmarche,LEN(nature) lennature from tableX where nseq='0'
Обратите внимание, что ([a-zA-Z]+)
образует пронумерованную группу захвата, значение которой позднее доступно с помощью заполнителя $1
(или заменыобратная ссылка).