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

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

"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 не поддерживает это, но я подумал, что, возможно, будет сторонняя библиотека, которая могла бы сделать это. Кто-нибудь может дать мне несколько советов?

Ответы [ 2 ]

1 голос
/ 29 ноября 2009

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

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();
1 голос
/ 29 ноября 2009

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

s/The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)/The quick $1 fox $2 over the lazy $3/
...