Pour une raison quelconque ce morceau de code Java me donne les matchs qui se chevauchent:Éviter le chevauchement correspondant regex en Java
Pattern pat = Pattern.compile("(" + leftContext + ")" + ".*" + "(" + rightContext + ")", Pattern.DOTALL);
aucune façon option/il évite la détection des chevauchements? par exemple. leftContext rightContext rightContext devrait être de 1 correspondance au lieu de 2
Voici le code complet:
public static String replaceWithContext(String input, String leftContext, String rightContext, String newString){
Pattern pat = Pattern.compile("(" + leftContext + ")" + ".*" + "(" + rightContext + ")", Pattern.DOTALL);
Matcher matcher = pat.matcher(input);
StringBuffer buffer = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(buffer, "");
buffer.append(matcher.group(1) + newString + matcher.group(2));
}
matcher.appendTail(buffer);
return buffer.toString();
}
Alors, voici la réponse finale à l'aide d'un test avant négatif, mon mauvais pour ne pas se rendant compte * était avide:
Pattern pat = Pattern.compile("(" +
leftContext + ")" + "(?:(?!" +
rightContext + ").)*" + "(" +
rightContext + ")", Pattern.DOTALL);
Pouvez-vous nous dire ce que leftContext et rightContext sont? Et donnez-nous un exemple de correspondance défaillante. – marcog
Obtenir le matcher regex pour capturer des choses qui se chevauchent est généralement une question un peu délicate, pas quelque chose qui se passe par défaut. Sans voir le contenu des modèles, il est difficile de dire ce qui se passe. Cela nécessiterait essentiellement des balises pour que le matcher passe par-dessus la même partie de la corde plus d'une fois. Est-ce que vous faites ça? – tchrist
rightContext et leftContext sont des chaînes simples e.g leftContext = "ab" rightContext = "cd" – Ricardo