我正在尝试将一行文本从源复制到目标,并且无论遇到什么特定模式,都需要对其进行一些修改。
输入:
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();
}
任何帮助都会非常有用。
答案 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)
答案 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);