Получение java.util.regex.PatternSyntaxException: недопустимое повторение при попытке заменить String на replaceAll () - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь сопоставить слова из данной строки с регулярным выражением

{{ some | value }}

следующим образом.

например:

Hello {{ some | value }}, this is what i tried {{ another | value }}

из этого я хочучтобы извлечь

{{ some | value }} and {{ another | value }}

Я попытался с этим шаблоном регулярных выражений Pattern.compile("\\{\\{(.*?)\\}\\}")

, когда я попытался повторить все совпадения и заменить, используя replaceAll, я получил java.util.regex.PatternSyntaxException: Illegal repetition.Пожалуйста, помогите мне решить эту проблему.

Мой код

Pattern pattern                     = Pattern.compile("\\{\\{(.*?)\\}\\}");
Matcher matcher                     = pattern.matcher(text);
 while(matcher.find()){
            matches.add(matcher.group());
        }

for (String match : matches) 
{
    match = match.substring(2 , match.length()-2); // I WANT TO GET ONLY SOME | VALUE FROM THE PATTERN
    String splitArray[] = match.split("\\|");
    String value1 = splitArray[0].trim();
    String value2 = splitArray[1].trim();
    text = text.replaceAll(match , value1);
}

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Метод, который вы используете, кажется излишне сложным.Глядя на ваш код, кажется, что вы хотите заменить {{ some | value }} на some и {{ another | value }] на another и так далее.Так почему бы просто не сделать это следующим образом?

text = text.replaceAll("\\{\\{ (.+?) \\| .+? \\}\\}", "$1");

Это будет соответствовать всем экземплярам {{ ... | ... }} и заменить его частью между {{ и |.

0 голосов
/ 30 мая 2018

Исправление, которое вам нужно, - заменить 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() для извлечения значений групп захвата, если вам это нужно.

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