2012-03-25 16 views
11

ho una stringa:Java String.split() Regex

String str = "a + b - c * d/e <f> g >= h <= i == j"; 

voglio dividere la stringa su tutti gli operatori, ma includono gli operatori nella matrice, quindi l'array risultante assomiglia:

[a , +, b , -, c , *, d , /, e , <, f , >, g , >=, h , <=, i , ==, j] 

ho questo momento:

public static void main(String[] args) { 
    String str = "a + b - c * d/e <f> g >= h <= i == j"; 
    String reg = "((?<=[<=|>=|==|\\+|\\*|\\-|<|>|/|=])|(?=[<=|>=|==|\\+|\\*|\\-|<|>|/|=]))"; 

    String[] res = str.split(reg); 
    System.out.println(Arrays.toString(res)); 
} 

questo è abbastanza vicino, dà:

[a , +, b , -, c , *, d , /, e , <, f , >, g , >, =, h , <, =, i , =, =, j] 

C'è qualcosa che posso fare per far apparire gli operatori di caratteri multipli nell'array come li voglio?

E come una domanda secondaria che non è altrettanto importante, c'è un modo nella regex di tagliare lo spazio bianco fuori dalle lettere?

+6

Si può semplicemente dividere per spazi nell'espressione di esempio per ottenere il risultato desiderato volere. – Jeffrey

+1

per la domanda secondaria: La stringa ha una funzione di ritaglio: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#trim() –

+1

@Jeffrey: gli spazi non necessariamente essere lì Ho gli spazi in là per facilità di leggibilità, ma potrebbe essere una qualsiasi combinazione di spazi o nessuno. Grazie comunque per l'idea! – user677786

risposta

31
String[] ops = str.split("\\s*[a-zA-Z]+\\s*"); 
String[] notops = str.split("\\s*[^a-zA-Z]+\\s*"); 
String[] res = new String[ops.length+notops.length-1]; 
for(int i=0; i<res.length; i++) res[i] = i%2==0 ? notops[i/2] : ops[i/2+1]; 

Questo dovrebbe farlo. Tutto ben conservato in res.

+0

Yeap, funziona, basta rimuovere l'elemento principale dall'array (che è vuoto) –

+0

Dopo essere tornato, questo sembra il modo migliore per farlo. Mi piacerebbe averlo fatto nella regex, ma funzionerà perfettamente. Grazie! – user677786

0

È possibile invertire la regex così divisa per i caratteri non operativi?

String ops[] = string.split("[a-z]") 
// ops == [+, -, *, /, <, >, >=, <=, == ] 

Questo ovviamente non restituisce le variabili nell'array. Forse si può alternare due split (uno da parte degli operatori, uno per le variabili)

+0

Sebbene non sia la soluzione esatta, mi ha dato l'idea che funzionasse! Grazie! Modificherò il post principale per la soluzione! – user677786

15
str.split (" ") 
res27: Array[java.lang.String] = Array(a, +, b, -, c, *, d, /, e, <, f, >, g, >=, h, <=, i, ==, j) 
1

Si potrebbe dividere su un confine di parola con \ b

+0

Hai provato? Avrai un problema – tchrist

+0

OK, lo ammetto, l'ho testato su .NET e ha funzionato. Rimuovere le voci vuote dovrebbe essere banale e rimuovere gli spazi nella stringa è sicuramente facilmente eseguibile con un .replaceAll prima di applicare Regex. –

4
String str = "a + b - c * d/e <f> g >= h <= i == j"; 
    String reg = "\\s*[a-zA-Z]+"; 

    String[] res = str.split(reg); 
    for (String out : res) { 
     if (!"".equals(out)) { 
      System.out.print(out); 
     } 
    } 

uscita: + - */<>> = < = ==

-3

Si potrebbe anche fare qualcosa di simile:

String str = "a + b - c * d/e <f> g >= h <= i == j"; 
String[] arr = str.split("(?<=\\G(\\w+(?!\\w+)|==|<=|>=|\\+|/|\\*|-|(<|>)(?!=)))\\s*"); 

Gestisce gli spazi bianchi e le parole di lunghezza variabile e produce l'array:

[a, +, b, -, c, *, d, /, e, <, f, >, g, >=, h, <=, i, ==, j]