2015-04-30 13 views
5

sto usando removeNumbers per rimuovere tutti i numeri in una stringa con l'espressione regolare
"(^|)\\d+($|(\\d+)+($|)|)"Regex per trovare i numeri in una stringa

Ecco il codice:

public class Regex {  
    private static String removeNumbers(String s) { 
    s = s.trim(); 
    s = s.replaceAll(" +", " "); 
    s = s.replaceAll("(^|)\\d+($|(\\d+)+($|)|)", " "); 
    return s.trim(); 
    } 

    public static void main(String[] args) { 
    String[] tests = new String[] {"123", "123 456 stack 789", "123 456 789 101112 131415 161718 192021", "stack 123 456 overflow 789 com", "stack 123 456 overflow 789", "123stack 456", "123 stack456overflow", "123 stack456", "123! @456#567"}; 
    for (int i = 0; i < tests.length; i++) { 
     String test = tests[i]; 
     System.out.println("\"" + test + "\" => \"" + removeNumbers(test) + "\""); 
    } 
    }  
} 

uscita:

"123" => "" 
" 123 " => "" 
"123 456 stack 789" => "stack" 
"123 456 789 101112 131415 161718 192021" => "" 
"stack 123 456 overflow 789 com" => "stack overflow com" 
"stack 123 456 overflow 789" => "stack overflow" 
"123stack 456" => "123stack" 
"123 stack456overflow" => "stack456overflow" 
"123 stack456" => "stack456" 
"123! @456#567" => "123! @456#567" 

C'è un modo migliore per farlo?

Edit:

Come suggerito da @ mbomb007 nella sua precedente risposta, la regex "(|^)[\\d ]+(|$)" funziona così:

private static String removeNumbers(String s) { 
    s = s.trim(); 
    s = s.replaceAll(" +", " "); 
    s = s.replaceAll("(|^)[\\d ]+(|$)", " "); 
    return s.trim(); 
} 
+0

La mia risposta era sbagliata, ma ora l'ho risolto. Ho pubblicato un collegamento a una versione web che esegue la regex contro i casi di test. – mbomb007

+0

L'output è corretto? Se sì e stai cercando un modo migliore per riscrivere il tuo codice, sembra che la tua domanda debba essere posta su http://codereview.stackexchange.com/. – Pshemo

+0

Le stringhe in ingresso possono iniziare o finire con spazi? – Pshemo

risposta

3

AFAIU, si può solo fare:

private static String removeNumbers(String s) { 
    return s.replaceAll("\\b\\d+\\b", "").replaceAll(" +", " ").trim(); 
} 

\b\d+\b corrisponde a una o più cifre che formano una parola.

EDIT:

Dato che il modello non deve corrispondere i numeri in una stringa come "123! @456#567", una combinazione di condizioni lookbehind e lookahead positivo può essere utilizzato:

private static String removeNumbers(String s) { 
    return s.replaceAll("(?<= |^)\\d+(?= |$)", " ").replaceAll(" +", " ").trim(); 
} 
+2

O tutto su una riga 'return s.replaceAll (" \\ d "," ") .replaceAll (" + "," ") .trim();' – ChrisStillwell

+0

Questo non funziona per il suo esempio: '" 123 stack456overflow "=>" stack456overflow "' – mbomb007

+0

Ho aggiunto un altro test case: '" 123! @ 456 # 567 "=>" 123! @ 456 # 567' –

0

Si può anche farlo con libreria guava:

String text = "stack 123 456 overflow 789 com"; 
String theLettersWithLargeSpaces = CharMatcher.JAVA_LETTER.or(CharMatcher.WHITESPACE).retainFrom(text); 
theLetters = CharMatcher.WHITESPACE.collapseFrom(theLettersWithLargeSpaces , ' '); 
System.out.println(theLetters); 

Ho assunto che non solo le cifre possono verificarsi, ma anche altre personaggi anted. L'output sarebbe: "stack overflow com"

CharMatcher è uno strumento molto potente. Penso che sia molto più leggibile rispetto alle regex.

Se si desidera solo una funzione:

public String clearUnwantedChars(String text) { 
     return CharMatcher.WHITESPACE.collapseFrom(CharMatcher.JAVA_LETTER.or(CharMatcher.WHITESPACE) 
      .retainFrom(text), ' '); 
} 
2

tuo regex è un po 'ridondante (e anche abbastanza non misura i vostri casi di test). È possibile utilizzare questo:

"\\b[ ]*(?<![^\\d\\s])[\\d]+(?![^\\d\\s])[ ]*\\b" 

Il carattere di escape \b rappresenta un confine di parola (inizio o la fine di una parola). Io uso anche [ ]* per assicurare che gli spazi tra i numeri vengano rimossi. Questa regex consente inoltre alle parole di contenere numeri senza che vengano sostituiti. Proprio come vuoi tu.

EDIT: ho aggiunto un aspetto negativo e un aspetto positivo.

(?<![^\\d\\s]) - Ciò garantisce che i caratteri immediatamente precedenti alle cifre siano solo più cifre o spazi.

(?![^\\d\\s]) - Ciò garantisce che i caratteri che seguono immediatamente le cifre siano solo più cifre o spazi.

Try it here con i casi di test. (Aggiornato il collegamento ipertestuale per il caso di test aggiunto)

+0

Ho aggiunto un altro test case: "" 123 ! @ 456 # 567 "=>" 123! @ 456 # 567' –

+0

@BharatKhatri L'ho modificato per il test case aggiunto e aggiornato il collegamento ipertestuale al nuovo esempio. Spero che lo trovi utile. – mbomb007

+0

Uno degli approcci precedenti che utilizza '" (| ^) [\\ d] + (| $) "' funziona correttamente. L'ho aggiunto in una modifica alla domanda, poiché hai aggiornato la tua risposta e l'approccio precedente non è più visibile. –

Problemi correlati