2010-10-20 16 views
2

Я не уверен, что это возможно, но мне нужен способ заменить значение пронумерованной группы, указанной в выражении моего регулярного выражения, строкой, объявленной динамически во время выполнения, были сделаны.Regex - Замена стоимости группы

Учитывая простой случай, что-то вроде ...

(/)?([A-Za-z0-9])?(/)?$ 

Я хотел бы быть в состоянии плагин замены для группы 2.

настоящее время я использую класс Сличитель в Java.

ответ

2

Да, это выполнимо. Проверьте мой ответ на this question, чтобы узнать, как это сделать. Фактически, этот вопрос, вероятно, должен быть закрыт как дубликат.

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

(/)?([A-Za-z0-9])?(/)?$ // NO 

(/?)([A-Za-z0-9]?)(/?)$ // YES 

Но он все равно будет соответствовать пустой подстроке в конце целевой строки, потому что все не является обязательным, за исключением якоря, $. Это действительно то, что вы хотели сделать?

0

Возвращает значение вашего поиска в регулярном выражении и сохраняет его в переменной, а затем выполняет замену в основной строке, используя результаты поиска регулярных выражений как цель поиска и динамически объявленную строку в качестве замены.

Действительно упрощена концептуальное:

String testString = "Hello there"; 
//String substring = *Do your regex work here* 
if(substring.length() > 0) { 
    testString.replace(substring, dynamicallyGeneratedString); 
} 
5

Я не уверен, если это возможно сделать ...

Да, это возможно. См. Пример ниже.

Я хотел бы быть в состоянии плагин замены для группы 2.

Эта демо «встраивается в» версии .toUpperCase группы 2 в качестве замены.

import java.util.regex.*; 

class Main { 
    public static void main(String... args) { 
     String input = "hello my name is /aioobe/ and I like /patterns/."; 
     Pattern p = Pattern.compile("(/)([A-Za-z0-9]+)(/)"); 
     Matcher m = p.matcher(input); 
     StringBuffer sb = new StringBuffer(); 
     while (m.find()) { 
      String rep = m.group(1) + m.group(2).toUpperCase() + m.group(3); 
      m.appendReplacement(sb, rep); 
     } 
     m.appendTail(sb); 
     System.out.println(sb); 
    } 
} 

Печать:

hello my name is /AIOOBE/ and I like /PATTERNS/. 
Смежные вопросы