如何用Java中的某些更改模式修改文本内容

时间:2019-04-04 20:17:58

标签: java regex

我正在尝试将一行文本从源复制到目标,并且无论遇到什么特定模式,都需要对其进行一些修改。

输入:

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 :(得分:0)

您应该使用类似(.*)(\/}.*\/})的模式,匹配直到第一个/},以获取之前和之后的信息

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

答案 1 :(得分:0)

如果要使用正则表达式和UIDPLUS,则可以使用Matcher的{​​{1}}方法。基本上,replaceAll()替换其Matcher中的匹配文本,并将其替换为传递给replaceAll()的字符串中的任何内容。例如,您可以使用:

Matcher

而不是上面的整个replaceAll(str) / matcher.replaceAll("$1$2 is manipulated$3") 块。

答案 2 :(得分:0)

首先,我建议您使用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);