2015-06-30 6 views
5

Sto eseguendo un test per trovare e sostituire una stringa di 3 o 4 lettere maiuscole seguita da un numero con la stessa stringa, un trattino e lo stesso numero. In Perl, posso usare:Inserimento di un trattino tra i gruppi con un problema di regex Java

s/([A-Z]{3,4})([0-9])/$1-$2/g; 

Ho provato questo in Java, hardcoding una stringa del tipo:

public class Test { 
    public static void main(String[] args) { 
     String test = "TEST1"; 

     Pattern p = Pattern.compile("([A-Z]{3,4})([0-9])"); 

     Matcher m = p.matcher(test); 
     if (m.find()) { 
      m.replaceAll(m.group(1) + "-" + m.group(2)); 
     } 
     System.out.println(test); 

    } 
} 

Ma viene trovata una corrispondenza. La sintassi di Java è errata o si tratta di un problema di espressioni regolari?

+3

replaceAll restituisce una nuova stringa dei vostri sostituzioni – beresfordt

+0

Se c'è un metodo all'interno della classe Matcher chiamato 'replaceAll()', qual è il suo prototipo? – sln

+0

Si prega di non aggiungere "RISOLTO" alla domanda. – Turing85

risposta

3

Non c'è bisogno di usare Pattern/Matcher, basta che si può fare:

test = test.replaceAll("([A-Z]{3,4})([0-9])", "$1-$2"); 
1

Matcher.replaceAll() restituirà una stringa, non sostituirà in linea.

come si vede qui: http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#replaceAll%28java.lang.String%29

+0

Ah si. Ancora, find() restituisce false in modo che non venga mai nemmeno chiamato –

+0

Ho provato il tuo esempio, per me, 'find()' restituisce true e la sostituzione viene chiamata correttamente. L'espressione regolare è corretta. Forse hai fatto un controllo su 'm.find()' nel debugger? Questo modificherà il matcher e cercherà la prossima partita, che non è lì, quindi le chiamate successive restituiscono false. – thst

1

Hai solo bisogno di usare un replaceAll con la regex avete già:

String test = "TEST1"; 
System.out.println(test.replaceAll("([A-Z]{3,4})([0-9])", "$1-$2")); 

Vedi IDEONE demo

Questo è da docs:

public String replaceAll(String regex, String replacement)
Sostituisce ogni sottostringa di questa stringa che corrisponde all'espressione regolare data con la sostituzione dato.

0

replaceAll 'sostituisce ogni sottosequenza della sequenza di input che corrisponde al modello con la stringa di sostituzione specificata.'

Si è abbinato all'intero input String e lo si sta sostituendo; potresti anche creare una nuova stringa dai tuoi gruppi abbinati.

import org.junit.Test; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import static org.hamcrest.CoreMatchers.equalTo; 
import static org.junit.Assert.assertThat; 

public class RegexTest { 

    @Test 
    public void regexReplaceSingleOccurance() { 
     String test = "TEST1"; 
     String expectedOutput = "TEST-1"; 
     String replaceAllOutput = null; 
     String concatenationOutput = null; 

     Pattern p = Pattern.compile("([A-Z]{3,4})([0-9])"); 

     Matcher m = p.matcher(test); 
     if (m.find()) { 
      out = m.replaceAll(m.group(1) + "-" + m.group(2)); 
     } 
     assertThat(replaceAllOutput, equalTo(expectedOutput)); 
     assertThat(concatenationOutput, equalTo(expectedOutput)); 
    } 
} 
Problemi correlati