java regex matcher.replaceВсе с группами - PullRequest
0 голосов
/ 05 декабря 2018

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

Pattern pattern = Pattern.compile("length\\((?<field>[a-zA-Z]+)\\)", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(statement);

if (matcher.find())
           statement = matcher.replaceAll("LEN(" + matcher.group("field") + ")");
        return statement;

Это простая вещь, где я хотел бынравится заменять все (проходные) совпадения и заменять их другим текстом.однако я борюсь с тем, чтобы группа итерировала динамически.

Ожидается : выберите *, LEN (разработайте) lendevise, LEN (марше) lenmarche, LEN (природа) lennatureиз таблицы X, где nseq = '0'

Фактически : выберите *, LEN (разработка) lendevise, LEN (разработка) lenmarche, LEN (разработка) lennature из таблицыX, где nseq = '0'

Так что вы можете заметить здесь.значение группы всегда заменяется группой первого совпадения вместо соответствующего сопоставляемого совпадения?

Существует ли эффективный "лучший" способ сделать это?Я хотел бы избежать (если возможно) помещать различные группы в отдельные массивы.

1 Ответ

0 голосов
/ 05 декабря 2018

Я предлагаю упростить решение до одного 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 (или заменыобратная ссылка).

...