2017-01-31 3 views
0

Quelle est la meilleure façon en Java pour faire le remplacement suivant sur les chaînes:Remplacer Groupes de capture Java Regex avec des parties Eux-mêmes

J'ai texte qui ressemble à ceci:

one two [[**my_word** other words]] three four [[**my_other_word** other words]] five six 

et je veux le texte suivant

one two **my_word** three four **my_other_word** five six 

j'ai essayé en utilisant des groupes de capture regex, mais comment puis-je remplacer un groupe de capture avec un autre?

+1

Pouvez-vous montrer ce que vous avez essayé et où vous êtes resté bloqué? – CKing

+0

chaque groupe a un numéro $ 1, $ 2, $ 3 ... Alors vous pouvez l'utiliser. $ 1 = groupe 1 capturé, exemple $ 1 = pomme de terre => "salut $ 1" (salut pomme de terre). –

+0

Je me suis coincé quand j'ai essayé d'utiliser l'API Java et Matcher. – xgb84j

Répondre

1
a.replaceAll("\\[\\[(\\*\\*\\w+\\*\\*)(?:\\s\\w+\\s?)+\\]\\]", "$1"); 
+0

Les barres obliques inverses que vous utilisez ne sont pas valides comme caractères d'échappement regex dans Java. Ils doivent être doubles contre-obliques. – Falle1234

+0

Hey, je voulais juste vous envoyer un ping sur votre dernière question C++. Vous avez eu un arrêt par erreur. 'std :: vector base (valeurs-> begin() + 1, valeurs-> begin() + 4);' ne vous donne que les 3 premiers éléments. Vous devez changer le 4 en 5 pour obtenir les 4 premiers éléments. – NathanOliver

+0

@NathanOliver ah, je savais que ce serait une erreur stupide. Je ne savais pas si c'était des limites de clôture inclusives ou exclusives. Merci! –

1

En fonction de vos besoins, vous pouvez soit utiliser un oneliner comme

a.replaceAll("\\[\\[(\\*\\*\\w+\\*\\*).*?\\]\\]", "$1"); 

Ou le plus c Version compliquée où vous pouvez contrôler à quoi remplacer chaque match.

String inputString = "one two [[**my_word** other words]] three four [[**my_other_word** other words]] five six"; 
Pattern pattern = Pattern.compile("\\[\\[(\\*\\*\\w+\\*\\*).*?\\]\\]", Pattern.DOTALL); 
Matcher matcher = pattern.matcher(inputString); 
StringBuffer outputBuffer = new StringBuffer(); 
while (matcher.find()) { 
    String match = matcher.group(1);   
    matcher.appendReplacement(outputBuffer, match); 
} 
matcher.appendTail(outputBuffer); 

String output = outputBuffer.toString();