Как изменить текстовое содержимое с каким-то измененным шаблоном в Java - PullRequest
0 голосов
/ 04 апреля 2019

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

Ввод:

I am #check Some Text/#Middle#check Text/#

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

#check Some Text is manipulated/#Middle#check Text/#

Фактический результат:

#check Some Text is manipulated/##check Text/#

Pattern pattern = Pattern.compile("(#check)([^/>]*)(/#)");
String line = "I am #check Some Text/#Middle#check Text/#";
String replaced = "";               
Matcher matcher = pattern.matcher(line);
while(matcher.find())
{
    if(matcher.group(2).contains("Some"))
        replaced+=matcher.group(1)+matcher.group(2)+" is manipulated"+matcher.group(3);
    else 
        replaced+=matcher.group();
}

Любая помощь будет очень полезна.

Ответы [ 3 ]

0 голосов
/ 04 апреля 2019

Если вы хотите использовать регулярные выражения и Matcher s, вы можете использовать Matcher 'replaceAll() метод. По сути, replaceAll() заменяет соответствующий текст в его Matcher и заменяет его на то, что находится в строке, переданной в replaceAll(str). Например, вы можете использовать:

matcher.replaceAll("$1$2 is manipulated$3")

вместо всего вашего if / else блока выше.

0 голосов
/ 04 апреля 2019

Прежде всего, я бы порекомендовал использовать Matcher.replaceAll() вместо построения строки самостоятельно. Завершенные все совпадения шаблона заменяются данной замещающей строкой. Вы можете использовать группы захвата из вашего шаблона, используя $X (например, $1 для первой группы) в вашей замещающей строке.

Итак, ваш код будет выглядеть так:

Pattern pattern = Pattern.compile("^.+?(?=#)(.*)(#check[^/#]+Some[^/#]+)(/#)(.*)");
Matcher matcher = pattern.matcher(line);
String replaced = matcher.replaceAll("$1$2 is manipulated$3$4");
System.out.println(replaced);

Вот некоторые результаты для заданных входных данных:

IN:  I am #check Some Text/#Middle#check Text/#
OUT: #check Some Text is manipulated/#Middle#check Text/#4

IN:  I am #check hello there Some Text/#Middle#check Text/#
OUT: #check hello there Some Text is manipulated/#Middle#check Text/#

IN:  I am #check Text/#Middle#check Some Text/#
OUT: #check Text/#Middle#check Some Text is manipulated/#

Если шаблон должен соответствовать регистронезависимому, вы можете использовать его для его создания:

Pattern pattern = Pattern.compile("...", Pattern.CASE_INSENSITIVE);
0 голосов
/ 04 апреля 2019

Вы должны использовать шаблон, например (.*)(\/}.*\/}), до первого /}, чтобы получить то, что было до, а что после

.
Pattern pattern = Pattern.compile("(.*)(\\/}.*\\/})");
String line = "I am {check Some Text/}Middle{check Text/}";
String replaced;               
Matcher matcher = pattern.matcher(line);
if(matcher.find()) {
    replaced = matcher.group(1)+" is manipulated"+matcher.group(2);
}else{ 
    replaced = matcher.group();
}
System.out.println(replaced)

> Code demo

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