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

Я хочу использовать значение $1 как целое число.
Идея состоит в том, чтобы заменить все числа из исходного текста эквивалентными значениями массива и создать новый текст.
Желаемый результат ниже должен быть "Это DBValue4, это DBValue2, это DBValue7"
Кроме того, есть ли способ сохранить эти обратные ссылки для дальнейшего использования?

String[] values = {"DBValue0","DBValue1","DBValue2","DBValue3","DBValue4","DBValue5","DBValue6","DBValue7","DBValue8","DBValue9","DBValue10"};
String originaltext = "This is 4, This is 2, This is 7";
text = originaltext.replaceAll("(\\d)","$1");
// want something like
text = originaltext.replaceAll("(\\d)",values[$1]);
//or
text = originaltext.replaceAll("(\\d)",values[Integer.parseInt("$1")]);

person Nikolaos Plastiras    schedule 24.07.2013    source источник
comment
Используйте Pattern и Matcher   -  person Boris the Spider    schedule 24.07.2013
comment
Вы можете взглянуть на этот пост: stackoverflow.com/questions/375420/   -  person Casimir et Hippolyte    schedule 24.07.2013


Ответы (1)


Вы можете использовать Pattern и Matcher так:

public static void main(String[] args) throws Exception {
    final String[] values = {"DBValue0", "DBValue1", "DBValue2", "DBValue3", "DBValue4", "DBValue5", "DBValue6", "DBValue7", "DBValue8", "DBValue9", "DBValue10"};
    final String originaltext = "This is 4, This is 2, This is 7";
    final Pattern pattern = Pattern.compile("(?<=This is )\\d++");
    final Matcher matcher = pattern.matcher(originaltext);
    final StringBuffer sb = new StringBuffer();
    while (matcher.find()) {
        System.out.println(matcher.group());
        final int index = Integer.parseInt(matcher.group());
        matcher.appendReplacement(sb, values[index]);
    }
    matcher.appendTail(sb);
    System.out.println(sb);
}

Выход:

4
2
7
This is DBValue4, This is DBValue2, This is DBValue7

ИЗМЕНИТЬ

В дополнение к комментарию ОП кажется, что ОП необходимо заменить Strings формы {name, index}, где «имя» — это имя массива, а «индекс» — индекс элемента в этом массиве.

Этого легко добиться, Mapпроверив массивы по их именам, используя Map<String, String[]>, а затем используя Pattern, который захватывает сначала name, а затем index.

public static void main(String[] args) throws Exception {
    final String[] companies = {"Company1", "Company2", "Company3"};
    final String[] names = {"Alice", "Bob", "Eve"};
    final String originaltext = "This is {company, 0}, This is {name, 1}, This is {name, 2}";
    final Map<String, String[]> values = new HashMap<>();
    values.put("company", companies);
    values.put("name", names);
    final Pattern pattern = Pattern.compile("\\{([^,]++),\\s*+(\\d++)}");
    final Matcher matcher = pattern.matcher(originaltext);
    final StringBuffer sb = new StringBuffer();
    while (matcher.find()) {
        System.out.println(matcher.group(1));
        System.out.println(matcher.group(2));
        final int index = Integer.parseInt(matcher.group(2));
        matcher.appendReplacement(sb, values.get(matcher.group(1))[index]);
    }
    matcher.appendTail(sb);
    System.out.println(sb);
}

Выход:

company
0
name
1
name
2
This is Company1, This is Bob, This is Eve
person Boris the Spider    schedule 24.07.2013
comment
Извините, но из соображений простоты пример не очень хорош. То, что вы сделали, работает, но я хочу использовать что-то более сложное, например String originaltext = {company,3} отправляет это сообщение для {name,2} владельца номера {number,10} от {new,11}; и текст = originaltext.replaceAll(\\{.+?,(\\d\\d?)\\},values[Integer.parseInt($1)]); . Какие-либо предложения? - person Nikolaos Plastiras; 24.07.2013
comment
Я не понимаю - значит у вас есть несколько массивов и вы хотите выбирать между ними на String? - person Boris the Spider; 24.07.2013
comment
Нет, я просто хочу заменить {something,an_int} в любом тексте свойством массива values[an_int]. - person Nikolaos Plastiras; 24.07.2013
comment
Мое редактирование должно сделать это за вас, если вы внесете пару изменений. - person Boris the Spider; 24.07.2013