Есть ли способ использовать список строковых параметров с регулярным выражением (с группами) для создания новой строки?

StackOverflow https://stackoverflow.com/questions/1814036

  •  06-07-2019
  •  | 
  •  

Вопрос

Скажем, например, что у меня есть регулярное выражение, подобное этому:

"The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)."

Это регулярное выражение имеет 3 сгруппированных компонента - если оно сопоставляется с данной строкой, API регулярного выражения позволит вам легко извлечь значение внутри каждой группы.

Теперь допустим, у меня есть 3 строки:

["red", "leaps","cat"]

Если предположить, что все символы в регулярном выражении, не входящие в группы, являются буквальными текстовыми символами - Есть ли способ затем вставить каждую из этих 3 строк в соответствующую группу в исходном регулярном выражении, в результате чего получается выходная строка, которая объединяет несгруппированные части регулярного выражения? В этом случае, в результате «быстрая рыжая лиса перепрыгивает через ленивого кота». Предпочтительно без необходимости иметь строку, которая уже соответствует регулярному выражению.

Я собираюсь сделать это на Java - я совершенно уверен, что java.util.regex не поддерживает это, но я подумал, что, возможно, будет сторонняя библиотека, которая могла бы сделать это. Кто-нибудь может дать мне несколько советов?

Это было полезно?

Решение

Пока вы можете обходиться без вложенных групп захвата, вы можете просто использовать больше регулярных выражений для извлечения литералов:

String[] strings = new String[] { "red", "leaps", "dog" };
String[] literals = new String("The quick (red|brown|blue|yellow) fox " +
    "(jumps|leaps) over the lazy (dog|cat).").split("(?=[^\\\\])\\(.*?\\)");

StringBuilder sb = new StringBuilder(literals[0]);
for(int i = 0; i < strings.length; i++) {
    sb.append(strings[i]);
    sb.append(literals[i + 1]);
}

// => sb.toString();

Другие советы

Большинство реализаций регулярных выражений позволяют вам делать что-то подобное в поиске и замене:

s/The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)/The quick $1 fox $2 over the lazy $3/
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top