2010-07-09 6 views
1

texte brut J'ai un tas de lignes dans un fichier texte et je veux faire correspondre ce ${ALPANUMERIC characters} et le remplacer par ${SAME ALPHANUMERIC characters plus _SOMETEXT(CONSTANT)}.Java regex correspondant

J'ai essayé cette expression ${(.+)} mais cela n'a pas fonctionné et je ne sais pas comment faire remplacer regex dans java.

vous remercions pour vos commentaires

Voici une partie de mon code:

BufferedReader br = new BufferedReader(new FileReader(file)); 
     String line; 
     StringBuilder sb = new StringBuilder(); 

     while ((line = br.readLine()) != null) { 
      Pattern p = Pattern.compile("\\$\\{.+\\}"); 
      Matcher m = p.matcher(line); // get a matcher object 
       if(m.find()) { 
        System.out.println("MATCH: "+m.group()); 
        //TODO 
        //REPLACE STRING 
        //THEN APPEND String Builder 
       } 
      }    

OK ce travaux ci-dessus, mais il fonde que ma variable et non la ligne entière pour ex voici mon entrée:

texte avant ${VARIABLE_NAME} texte après
texte avant ${VARIABLE_NAME2} texte après
texte avant une t poste sans variable de texte après
... etc

donc je veux juste remplacer le ${VARIABLE_NAME} ou ${VARIABLE_NAME} avec ${VARIABLE_NAME2_SOMETHING} mais laisser précédant et suivant la ligne de texte tel qu'il est

EDIT:

I bien que je pensais d'une façon comme ceci:

if(line.contains("\\${([a-zA-Z0-9 ]+)}")){ 
        System.out.println(line); 
       } 

if(line.contains("\\$\\{.+\\}")){ 
        System.out.println(line); 
       } 

Mon idée était de capturer la ligne contenant, remplacez alors, mais le regex i s pas ok, il fonctionne bien avec la combinaison pattern/matcher.

EDIT II

Je sens que je me rapproche de la solution ici, voici ce que je suis venu avec jusqu'à présent:

if(line.contains("$")){ 
        System.out.println(line.replaceAll("\\$\\{.+\\}", "$1" +"_SUFFIX")); 
       } 

Ce que je voulais dire par $1 est la chaîne que vous venez de remplacer la remplace par elle-même + _SUFFIX

Répondre

1

LA SOLUTION:

while ((line = br.readLine()) != null) { 

       if(line.contains("$")){ 
        sb.append(line.replaceAll("\\$\\{(.+)\\}", "\\${$1" +"_SUFFIX}") + "\n"); 
       }else{ 
        sb.append(line + "\n"); 
       } 

      } 
1

Le $ est un caractère d'expression régulière spécial qui représente la fin d'une ligne. Vous aurez besoin de l'échapper pour le faire correspondre. Vous aurez également besoin d'échapper la barre oblique inversée que vous utilisez pour échapper le signe dollar en raison de la façon dont Java gère les chaînes.

Une fois que vous avez votre texte dans une chaîne, vous devriez être en mesure de faire ce qui suit:

str.replaceAll("\\${([a-zA-Z0-9 ]+)}", "\\${$1 _SOMETEXT(CONSTANT)}") 

Si vous avez d'autres caractères dans les noms des variables (c.-à-underscores, symboles, etc ...), puis ajoutez-les simplement à la classe de caractères que vous recherchez.

Modifier: Si vous souhaitez utiliser un Pattern et un Matcher, il y a encore quelques modifications. D'abord, vous voulez probablement compiler votre Pattern en dehors de la boucle. Deuxièmement, vous pouvez l'utiliser, même si c'est plus bavard.

Pattern p = Pattern.compile("\\$\\{.+\\}"); 
Matcher m = p.matcher(line); 
sb.append(m.replaceAll("\\${$1 _SOMETEXT(CONSTANT)}")); 
1

Je voudrais utiliser la méthode String.replaceAll() comme ceci:

`cordes vieux = "certaines données de chaîne"; Chaîne new = old.replaceAll ("$ ([a-zA-Z0-9] +)", "(\ 1) CONSTANT")

`

1
line = line.replaceAll("\\$\\{\\w+", "$0_SOMETHING"); 

Il n'y a pas besoin de vérifier la présence de $ ou que ce soit; cela fait partie de ce que fait replaceAll(). Quoi qu'il en soit, n'est pas alimenté par regex comme find(); il fait juste une recherche de texte littérale ordinaire.