Исправление, которое вам нужно, - заменить text = text.replaceAll(match , value1);
на
text = text.replaceFirst(Pattern.quote(match), Matcher.quoteReplacement(value1));
. Оно заменит первое вхождение match
на value1
, где match
и value1
являются буквальными строками.
Однако я считаю, что вы хотите заменить все {{...|...}}
на ключевую часть, фактически не собирая все совпадения / захваты.Затем используйте
text.replaceAll("\\{\\{\\s*((?:(?!\\{\\{)[^|])*?)\\s*\\|\\s*(.*?)\\s*\\}\\}", "$1")
См. Демонстрационную версию regex .
Подробности
\{\{
- a{{
substring \s*
- 0+ пробелов ((?:(?!\{\{)[^|])*?)
- Группа 1: любой символ, отличный от |
, 0 или более, но с минимальным количеством повторений, не запускающийсяa {{
sequence \s*
- 0+ пробелов \|
- a |
\s*
- 0+ пробелов (.*?)
- группа 2: любые 0+ символов, как можно меньше \s*
- 0+ пробелов \}\}
- подстрока }}
.
См. Демонстрационную версию Java :
String text = "Hello {{ some | value }}, this is what i tried {{ another | value }}";
text = text.replaceAll("\\{\\{\\s*((?:(?!\\{\\{)[^|])*?)\\s*\\|\\s*(.*?)\\s*\\}\\}", "$1");
System.out.println(text);
// => Hello some, this is what i tried another
Обратите внимание, что вы все еще можете использовать Matcher#find()
для извлечения значений групп захвата, если вам это нужно.