2009-11-28 2 views
1

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

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

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

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

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

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

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

+0

Почему бы не использовать библиотеку шаблонов? Какую цель вы имеете в виду? –

+0

Является ли строка регулярных выражений последовательной? Или разрешено иметь что-то вроде '' Быстрая% s лиса% s за ленивые% s. "? – BalusC

+0

Я ищу что-то вроде реверса django() для сопоставлений url. Django позволяет сопоставлять регулярные выражения вызывающим, а при использовании функции reverse() группы становятся параметрами вызываемого. Пример:/user/(\ d +)/maps to home (user_id), поэтому reverse (home, 12) возвращает «/ user/12 /» (в основном возвращает URL-адрес, который будет отображаться на нем). Теперь, когда я выкопал код в django, похоже, что он использует довольно сложный (и интересный!) Бит кода, который вручную анализирует регулярное выражение для создания объекта, который может генерировать обратное сопоставление URL из списка arg , Я могу просто переопределить в java. – mpobrien

ответ

1

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

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(); 
+0

для более длинных строк вы можете использовать скомпилированный 'Pattern' с' Matcher' вместо 'split' –

1

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

s/The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)/The quick $1 fox $2 over the lazy $3/ 
Смежные вопросы