Регулярное выражение — замена значения группы

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

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

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

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

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


person cweston    schedule 20.10.2010    source источник


Ответы (3)


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

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

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

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

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

person Alan Moore    schedule 20.10.2010

Я не уверен, что это возможно...

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

Я хотел бы иметь возможность подключить замену для группы 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/.
person aioobe    schedule 20.10.2010

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

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

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