Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    sostituizione stringa con replaceFirst mancata

    Ciao,sto provando a sostituire ad una stringa del tipo:
    (A(BC)(RS))
    ogni parentesi con una chiave(stringa)diversa,finchè uso il metodo replace su una stringa in input che ha parentesi con lettere diverse, tutto va bene Se però l'input è questo
    (A(A)(A)(A)) mi vengono sostituite tutte le parentesi con la stessa chiave come giusto che sia,ma questo non mi va bene,per rimediare a ciò ho pensato di sostituire replace con replaceFirst pensando di ottnere l'effetto desiderato ossia:
    (A°1°(A)(A))
    (A°1°°2°(A))
    (A°1°°2°°3°)
    °4°
    ma ciò non accade chi mi sa dire come mai?se non è chiaro cerco di spiegarmi meglio


    codice:
    	       Scanner in_Str=new Scanner(System.in);		
    		Pattern patternRiga     = Pattern.compile("([(]([A-Z0-9°]+)[)])");
    		String Riga     ="",Riga2="";
    		String blocco ="";
    		String espr2="";
    		int kB=1;
            StringTokenizer St ;
      
        do{     
    	   System.out.println("****************************************IMMETTI RIGA******************************************************");
    	    Riga=in_Str.nextLine();	
    
    	     while(Riga.contains("(")){	
    	      	 Matcher matcher = patternRiga.matcher(Riga);
    	      	       while( matcher.find() ){//finche ci sono parentesi elementari 
    	  			   	   	 blocco=matcher.group();  
    	  			   	   	 String chiave= "°".concat(String.valueOf(kB)).concat("°");
    	  			   	   	  //********* CALCOLO BLOCCO *********
    	  	         //replace    	   
    	  Riga2=Riga.replaceFirst(blocco,chiave);  //<---ERROREEEE!
             Riga=Riga2;  
    	  					 System.out.println(Riga);  
    	  					 kB++;
    	  		      }		
    	     }	
    	     
        }while(true);

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    io non ho chiaro quello che vuoi fare, scrivi degli esempi di input e output desiderato
    RTFM Read That F*** Manual!!!

  3. #3
    Allora in poche parole voglio che data per esempio la stringa
    String s="(A(A)(A)(A))"
    e questo
    String bloccoA=(A);

    String StringaMod=s.replaceFirst(bloccoA,"°0°");

    vorrei che la stringaMod avesse solo la prima occorrenza modificata (A) e non tutte !cosi
    (A°0°(A)(A)) //ok
    e non cosi :
    (A°0°°0°°0°) //nooo !

    Scusa magari da prima potevo scrivere direttamente questo senza tutto il codice che piu chiaro

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    magari anche rispettare un po' le regole grammaticali, davvero ci vuole un po' per capire quello che scrivi.

    In ogni caso

    codice:
    public class TestClass{
    
       public static void main(String[]args){
       
           String prova  ="(A(A)(A)(A))";
           String blocco = "(A)"; 
           
           String ret = prova.replaceFirst(blocco,"°0°");
           System.out.println(ret); 
        }
     }
    ho come output

    codice:
    (°0°(A)(A)(A))
    anche se in realtà non sostituisce il tuo pattern
    spe faccio 2 prove

    Guarda, adesso non ho tempo per controllare bene bene, ma so che questa istruzione
    codice:
    		String prova = "(A(A)(A)(A))";
    		String blocco = "(A)";
    
    		String ret = prova.replaceFirst(blocco, "°0°");
    boolean outpu = Pattern.compile(blocco).matcher(prova).matches(); 
    		System.out.println(ret + " " + outpu);
    dovrebbe tornare vero e invece ritorna falso, anche se secondo me scritta così la regex non va.
    RTFM Read That F*** Manual!!!

  5. #5
    Probabilmente devi aggiungere il \ alla tonda perchè sia interpretata come carattere del pattern.
    "Mai discutere con un idiota. Ti trascina al suo livello e ti batte con l'esperienza." (Oscar Wilde)

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da satifal
    Probabilmente devi aggiungere il \ alla tonda perchè sia interpretata come carattere del pattern.
    In effetti questo va

    codice:
    String prova = "(A(A)(A)(A))";
    		String blocco = "\\(A\\)";
    
    		String ret = prova.replaceFirst(blocco, "°0°");
    		boolean outpu = Pattern.compile(blocco).matcher(prova).matches();
    		System.out.println(ret + " " + outpu);
    anche se quello in grassetto è ancora false...ho sempre odiato le regex!!!
    RTFM Read That F*** Manual!!!

  7. #7
    Il codice che ho scritto prima fa qualcosa di simile,ma non funziona correttamente ,gli potresti dare un'occhiata ???visto che l' ho postato.
    quando lo eseguo va in loop cosa che non fa se metto replace al posto di replaceFirst...

    l'algoritmo non è nient'altro che:
    1) prende la riga
    2)facendo uso di matcher considero le parentesi elementari, cioè che contengono solo lettere es(AB)
    3)al posto di ognuna di queste parentesi ci metto una stringa chiamata chiave composta cosi: °0° ...(dovrebbe essere sempre diversa)
    cosi via finchè la riga non è priva di parentesi.

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da valeriAsus
    Il codice che ho scritto prima fa qualcosa di simile,ma non funziona correttamente ,gli potresti dare un'occhiata ???visto che l' ho postato.
    quando lo eseguo va in loop cosa che non fa se metto replace al posto di replaceFirst...
    un problema come il controllo di una riga mi va bene, controllare il resto io onestamente non ho il tempo
    RTFM Read That F*** Manual!!!

  9. #9
    comunque 4 righe di codice sono... ed il problema è solo che replaceFirst al posto di replace non funziona.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.