Java RegEx не заменяет все - PullRequest
1 голос
/ 21 июня 2019

Я пытался заменить символ конкатенации '+' на '||' в данном многострочном скрипте, однако, кажется, что регулярное выражение Java просто заменяет 1 вхождение, а не все.

String ss="A+B+C+D";
Matcher mm=Pattern.compile("(?imc)(.+)\\s*\\+\\s*(.+)").matcher(ss);

while(mm.find())
{
    System.out.println(mm.group(1));
    System.out.println(mm.group(2));
    ss=mm.replaceAll("$1 \\|\\| $2");
}

System.out.println(ss); // Output: A+B+C||D, Expected: A||B||C||D

Ответы [ 3 ]

2 голосов
/ 21 июня 2019

Вы можете просто использовать:

ss = ss.replaceAll("\\+", "||")

как указал @ernest_k. Если вы действительно хотите продолжать использовать сопоставление с итерацией, тогда используйте Matcher#appendReplacement с StringBuffer:

String ss = "A+B+C+D";
Matcher mm = Pattern.compile("\\+").matcher(ss);

StringBuffer sb = new StringBuffer();

while (mm.find()) {
    mm.appendReplacement(sb, "||");
}
mm.appendTail(sb);

System.out.println(sb);
1 голос
/ 21 июня 2019

Причина, по которой вы заменяете только один элемент, состоит в том, что вы соответствуете всей строке. Регулярное выражение, которое вы используете "(?imc)(.+)\\s*\\+\\s*(.+)", соответствует чему-либо (.+) до конца, затем возвращается, поэтому оно может соответствовать остальным \\s*\\+.... Так что в основном ваша группа 1 +. Почти все, но последний + и далее. Следовательно, replaceAll может совпадать только один раз и завершится после этой замены. То, что вам нужно, это замена, которая находит +, необязательно заключенную в пробелы:

Pattern.compile("(?imc)\\s*\\+\\s*");

Это должно соответствовать всем, что вы хотите сопоставить, и не соответствует всей строке, а только вашему замещающему символу.

0 голосов
/ 21 июня 2019

Я думаю, может быть, нам просто нужно заменить простую строку:

Демо

Тест

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "\\+";
final String string = "A+B+C+D";
final String subst = "||";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
final String result = matcher.replaceAll(subst);

System.out.println(result);

Эта ссылка на правой панели объясняет ваше оригинальное выражениеПервая группа захвата совпадает от одного до неограниченного количества раз, насколько это возможно, поэтому здесь она не будет работать.Если бы мы изменили их на (.+?), это бы частично сработало, но все еще не нужно.

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