заменить подстроки в строке, используя группы регулярных выражений - PullRequest
0 голосов
/ 08 октября 2018

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

Для упрощения приведу пример того, что я ищу:

Строка ввода

Steve;nuLL;2;null\n
null;nullo;nUll;Marc\n
....

Ожидаемый результат

Steve;;2;\n
;nullo;;Marc\n
...

Код

Matcher matcher = Pattern.compile("(?i)(^|;)(null)(;|$)").matcher(dataStr);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
    matcher.appendReplacement(sb, matcher.group(1) + "" + matcher.group(3));
}
return sb.toString();

Можно ли решить эту проблему с помощью регулярных выражений?

РЕДАКТИРОВАТЬ:

Из приведенного выше Java-кода я получаю только первое совпадение, которое когда-либо заменялось, но не каждое появление в строке и в потоке данных.По любой причине matcher.find() выполняется только один раз.

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Вы, вероятно, что заменить null, если за ним следует несколько символов, например:

first.replaceAll("(?i)(null)(?=[;$\\\n])", "")
0 голосов
/ 09 октября 2018

Вам не нужно ничего необычного:

str = str.replaceAll("(?i)\\bnull\\b", "");

(?1) означает «игнорировать регистр».\b означает «граница слова».Введенные новые строки не имеют значения.

0 голосов
/ 08 октября 2018
return dataStr.replaceAll("(?smi)\\bnull\\b", "");
  • \b - это граница слова.
  • (?i) - команда с i = игнорировать регистр.
  • ((?s) - это DOT_ALL, . Соответствующие символы новой строки тоже.)
  • (?m) - это MULTI_LINE.

Вы забыли appendTail, для всех после последней замены.Если строка содержит более одной строки, добавьте параметр MULTI_LINE для реинтерпретации ^ и $.См. Javadoc Pattern.

while (matcher.find()) {
    matcher.appendReplacement(sb, matcher.group(1) + "" + matcher.group(3));
}
matcher.appendTail(sb);

В качестве альтернативы с лямбдой:

String result = matcher.replaceAll(mr -> mr.group(1) + mr.group(3));

, где mr - это свободно именуемое MatchResult, предоставленное replaceAll.

...