Java Regex: использовать захваченную группу как ключ в карте [дубликат]

До Java 8 мы могли бы использовать Arrays.toString(array) для печати одномерного массива и Arrays.deepToString(array) для многомерных массивов. У нас есть опция Stream и lambda в Java 8, которая также может использоваться для печати массива.

Печать одномерного массива:

public static void main(String[] args) {
    int[] intArray = new int[] {1, 2, 3, 4, 5};
    String[] strArray = new String[] {"John", "Mary", "Bob"};

    //Prior to Java 8
    System.out.println(Arrays.toString(intArray));
    System.out.println(Arrays.toString(strArray));

    // In Java 8 we have lambda expressions
    Arrays.stream(intArray).forEach(System.out::println);
    Arrays.stream(strArray).forEach(System.out::println);
}

вывод:

[1, 2, 3, 4, 5] [John, Mary, Bob] 1 2 3 4 5 John Mary Bob

Печать многомерного массива На всякий случай, когда мы хотим напечатать многомерный массив, мы можем использовать Arrays.deepToString(array) как:

public static void main(String[] args) {
    int[][] int2DArray = new int[][] { {11, 12}, { 21, 22}, {31, 32, 33} };
    String[][] str2DArray = new String[][]{ {"John", "Bravo"} , {"Mary", "Lee"}, {"Bob", "Johnson"} };

    //Prior to Java 8
    System.out.println(Arrays.deepToString(int2DArray));
    System.out.println(Arrays.deepToString(str2DArray));

    // In Java 8 we have lambda expressions
    Arrays.stream(int2DArray).flatMapToInt(x -> Arrays.stream(x)).forEach(System.out::println);
    Arrays.stream(str2DArray).flatMap(x -> Arrays.stream(x)).forEach(System.out::println);
} 

. Теперь точкой наблюдения является то, что метод Arrays.stream(T[]), который в случае из int[] возвращает нас Stream<int[]>, а затем метод flatMapToInt() отображает каждый элемент потока с содержимым отображаемого потока, созданного путем применения предоставленной функции отображения к каждому элементу.

Выход:

[[11, 12], [21, 22], [31, 32, 33]] [[John, Bravo], [Mary, Lee], [Bob, Johnson]] 11 12 21 22 31 32 33 Джон Браво Мэри Ли Боб Джонсон

3
задан Nikolaos Plastiras 24 July 2013 в 14:41
поделиться

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

EDIT

В дополнение к OP комментарий кажется, что OP должен заменить String s формы {name, index}, где «name» - это имя массива, а «index» - это индекс элемента в этом массиве.

Это легко достигается с помощью Map ping массивов с их именами, используя 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
4
ответ дан Boris the Spider 24 August 2018 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: