Я хочу заменить текст запроса на "_"

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

Вот мой вклад:

Не удалось обработать запрос 0 [null-> null s: 0 w: 0,0 a: 0,0 S: 0 t: 24543060 s (NA) (0 0)] на предмет RealTimeUpdate

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

Не удалось обработать запрос _ на предмет RealTimeUpdate

часть б

Как я могу удалить все экземпляры этого шаблона в тексте?

Ввод:

Не удалось обработать запрос 0 [null-> null s: 0 w: 0,0 a: 0,0 S: 0 t: 24543060 s (NA) (0 0)] на предмет RealTimeUpdate. Запрос был: 0 [null-> null s: 0 w: 0,0 a: 0,0 S: 0 t: 24543060 s (NA) (0 0)]

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

Не удалось обработать запрос _ на предмет RealTimeUpdate. Запрос был: _

Вот моя попытка:

Pattern p = Pattern.compile("(\"Failed to handle request\")(\\d)("[")(.*)(\"]\")(.*)");
Matcher m = p.matcher(input);
if (m.find()) {
    String output = m.replaceAll("$1"+"$2"+"$3"+"_"+"$5"+"$6"); 
}

Или

Если мне обещают, что шаблон начинается с "[null->null":

str.replaceAll((\\d)(\"[null->null\")(*.)(\"]\")", "X");
-1
Elad Benda 3 Сен 2016 в 23:10

3 ответа

Лучший ответ

Я сейчас не совсем точно знаю синтаксис вашего запроса, но если предположить, что он состоит из числа, за которым следует текст в скобках, вы можете использовать str = str.replaceAll( "\\d\\[.*?\\]", "_");.

1
uoyilmaz 3 Сен 2016 в 20:22

Использование положительного просмотра назад нулевой ширины:

str.replaceAll( "(?<=request )\\d\\[.*?\\]", "_");
2
redneb 3 Сен 2016 в 20:32

Если вы хотите удалить все, что находится между Failed to handle request и on subject.*, вы действительно можете использовать группировку java regex. Вот как:

output = input;
Pattern pattern = Pattern.compile("Failed to handle request (.+) on subject.*");
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
    String request = matcher.group(1);
    output = input.replace(request, "_");
}

Быстрее было бы поймать все, кроме запроса, а потом собрать воедино:

output = input;
Pattern pattern = Pattern.compile("(Failed to handle request ).+( on subject.*)");
Matcher matcher = pattern.matcher(input);
if (matcher.find()) {
    String beforeRequest = matcher.group(1);
    String afterRequest = matcher.group(2);
    output = beforeRequest + "_" + afterRequest;
}

Взглянем на стрелку Pattern:

(Failed to handle request ).+( on subject.*)

Вы можете найти объяснение здесь: https://regex101.com/r/xB6yW8/1

1
Zabuzard 3 Сен 2016 в 20:29