Как именно вы заменяете группы, добавляя их в строковый буфер? Пример: (a) (b) (c) Как вы можете заменить группу 1 на d, группу 2 на e и так далее? Я работаю с Java regex engine. Спасибо заранее.Как вы заменяете группы в регулярном выражении?
ответ
Вы можете использовать Matcher#start(group)
и Matcher#end(group)
построить общий метод замены:
public static String replaceGroup(String regex, String source, int groupToReplace, String replacement) {
return replaceGroup(regex, source, groupToReplace, 1, replacement);
}
public static String replaceGroup(String regex, String source, int groupToReplace, int groupOccurrence, String replacement) {
Matcher m = Pattern.compile(regex).matcher(source);
for (int i = 0; i < groupOccurrence; i++)
if (!m.find()) return source; // pattern not met, may also throw an exception here
return new StringBuilder(source).replace(m.start(groupToReplace), m.end(groupToReplace), replacement).toString();
}
public static void main(String[] args) {
// replace with "%" what was matched by group 1
// input: aaa123ccc
// output: %123ccc
System.out.println(replaceGroup("([a-z]+)([0-9]+)([a-z]+)", "aaa123ccc", 1, "%"));
// replace with "!!!" what was matched the 4th time by the group 2
// input: a1b2c3d4e5
// output: a1b2c3d!!!e5
System.out.println(replaceGroup("([a-z])(\\d)", "a1b2c3d4e5", 2, 4, "!!!"));
}
Проверить online demo here.
Это намного сложнее, чем нужно. См. [Ответ gtgaxiola] (http://stackoverflow.com/a/20981946/20938). –
@AlanMoore 'appendReplacement()' - элегантное решение для случаев, когда достаточно простой замены. Даже в этом случае я не думаю, что мое решение сложно. Тем не менее, метод «replaceGroup()» решает гораздо более сложную задачу, чем просто заменять - и в родовом, параметризованном виде. Попытайтесь получить результаты на моем примере 'main()' с другим, и вы получите то, что я имею в виду. – acdcjunior
Я думаю, что, возможно, нашел другое решение. Я пытаюсь понять, могут ли инструкции switch помочь нам каким-то образом. –
Вы ищете что-то в этом роде?
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Program1 {
public static void main(String[] args) {
Pattern p = Pattern.compile("(a)(b)(c)");
String str = "111abc222abc333";
String out = null;
Matcher m = p.matcher(str);
out = m.replaceAll("z$3y$2x$1");
System.out.println(out);
}
}
Это дает 111zcybxa222zcybxa333
как выход.
Я думаю, вы увидите, что делает этот пример.
Но хорошо, я думаю, не готовы встроенный
метода, через который вы можете сказать, например:
- заменить группу 3 с ZZZ
- заменить группу 2 с ими
- заменить группу 1 с ххм
Было бы неплохо иметь лямбды для такого рода случаев? Затем вы можете запустить эти лямбды через небольшой цикл и даже использовать хеш-карты для хранения групп регулярных выражений в качестве ключей и их заменяющих шаблонов в качестве значений! Спешите JDK 8! –
Перед выполнением замены вам не нужно вызывать 'find()'. Если совпадений нет, 'replaceAll()' просто возвращает исходную строку. –
@AlanMoore Согласен. Обновлено. –
Вы можете использовать Matcher's
appendReplacement
Вот пример пример использования:
вход: «привет боб Как ваша кошка»
регулярное выражение: "(боб | кошки)"
выход: "привет алиса Как ваша собака"
public static void main(String[] args) {
Pattern p = Pattern.compile("(bob|cat)");
Matcher m = p.matcher("hello bob How is your cat?");
StringBuffer s = new StringBuffer();
while (m.find()) {
m.appendReplacement(s, doReplace(m.group(1)));
}
m.appendTail(s);
System.out.println(s.toString());
}
public static String doReplace(String s) {
if(s.equals("bob")) {
return "alice";
}
if(s.equals("cat")) {
return "dog";
}
return "";
}
+1, но вы забыли завершить его, вызвав 'appendTail()'. Я починил это. –
@AlanMoore спасибо товарищу! – gtgaxiola
- 1. Как группы в регулярном выражении
- 2. Именованные группы в регулярном выражении
- 3. Пустых группы в регулярном выражении
- 4. Дополнительные группы в регулярном выражении
- 5. Как вы выражаете это в регулярном выражении?
- 6. Ссылка на группы в регулярном выражении MySQL?
- 7. Нахождение последней группы в регулярном выражении
- 8. Повторные группы в регулярном выражении заменить
- 9. Подсчитать группы захвата в регулярном выражении qr?
- 10. определить, какие группы совпадающих в регулярном выражении
- 11. Как (?: \; Jsessionid = [^ \? #] *)? в регулярном выражении?
- 12. побега (в регулярном выражении
- 13. Группировка в регулярном выражении
- 14. Как вы выбираете последнюю группу в этом регулярном выражении?
- 15. Коррекция в регулярном выражении
- 16. Как получить (возможно, вложенные) группы захвата в регулярном выражении?
- 17. Как назначить именованные группы в регулярном выражении локальным переменным
- 18. Что означает: в регулярном выражении?
- 19. Недопустимая группа в регулярном выражении
- 20. Попытка понять «Захватывающие группы» в регулярном выражении с Java
- 21. Как вы используете символы Unicode в регулярном выражении в Ruby?
- 22. Проблема в регулярном выражении
- 23. Узор в регулярном выражении
- 24. Как совместить «/ *» в регулярном выражении?
- 25. Как исключить '@' в регулярном выражении
- 26. Переменные в регулярном выражении
- 27. Ошибка в регулярном выражении?
- 28. Получение значения в регулярном выражении группы в замене называют
- 29. отрицание в регулярном выражении
- 30. Полупространство в регулярном выражении
возможно дубликат [Можно ли заменить групп в Java регулярное выражение ?] (http://stackoverflow.com/questions/988655/can-i-replace-groups-in-java-regex) –