Я решил это с помощью этого выражения: <resource(?:(?!<propertyValue).)+<propertyValue name="RCSA"(?:(?!<resource).)+</resource>
но это медленно.Поэтому я немного обдумал, что еще можно сделать в Java, и нашел простое и быстрое решение.
Pattern p = Pattern.compile("<resource name=.+?</resource>",
Pattern.MULTILINE | Pattern.DOTALL);
String in = getStringFromFile(path, name, pre, count);
System.out.println("Länge: " + in.length());
Matcher m = p.matcher(in);
StringBuffer sb = new StringBuffer();
int c = 0;
while (m.find()) {
m.appendReplacement(sb, getReplacementStage1(m, c++));
}
m.appendTail(sb);
writeStringToFile(path, name, pre, count, sb.toString());
Итак, сначала я использую более простой и быстрый RegEx, а затем вместо String.replace. Все я используюдля того, чтобы иметь возможность рассчитать замену для каждой находки.
private static String getReplacementStage1(Matcher m, int c) {
Pattern p1 = Pattern.compile(
"<resource[^>]*?contentType=\"Evaluation\"", Pattern.MULTILINE
| Pattern.DOTALL);
Matcher m1 = p1.matcher(m.group());
if (!m1.find()) {
// remove
return "";
}
Pattern p2 = Pattern.compile("<propertyValue name=\"(?:RCSA|TRA)\"",
Pattern.MULTILINE | Pattern.DOTALL);
Matcher m2 = p2.matcher(m.group());
if (m2.find()) {
// remove
return "";
}
// no change, return the group
return m.group();
}
Так что, может быть, это решение поможет кому-то с подобной проблемой, которая не любит / не нуждается в парсере XML ...