2012-03-25 14 views
11

Ich habe eine Zeichenfolge:Java String.split() Regex

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

Ich möchte die Zeichenfolge auf alle Operatoren spalten, sondern umfassen die Operatoren in der Anordnung, so dass die resultierende Anordnung wie folgt aussieht:

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

ich habe dies zur Zeit bekam:

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)); 
} 

Dieses ziemlich nahe ist, gibt es:

Gibt es etwas, was ich tun kann, um die Mehrfachzeichenoperatoren im Array erscheinen zu lassen, wie ich sie will?

Und als eine sekundäre Frage, die nicht annähernd so wichtig ist, gibt es einen Weg in der Regex, um die Leerzeichen aus der Nähe der Buchstaben zu trimmen?

+6

Sie könnten einfach durch Leerzeichen in Ihrem Beispielausdruck aufteilen, um das Ergebnis zu erhalten wollen. – Jeffrey

+1

für Ihre sekundäre Frage: String hat eine Trim-Funktion: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#trim() –

+1

@ Jeffrey: Die Räume nicht unbedingt da sein. Ich habe die Räume für eine bessere Lesbarkeit, aber es könnte eine beliebige Kombination von Leerzeichen oder keine sein. Danke für die Idee! – user677786

Antwort

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]; 

Dies sollte es tun. Alles schön in res gespeichert.

+0

Yeap, das funktioniert, entfernen Sie einfach das führende Element aus dem Array (das leer ist) –

+0

Nach dem Zurückkommen scheint dies der beste Weg, um es zu tun. Ich hätte es gern in der Regex gemacht, aber das wird perfekt funktionieren. Vielen Dank! – user677786

0

Kannst du deine Regex durch die Nicht-Operationszeichen teilen?

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

Dies gibt offensichtlich die Variablen im Array nicht zurück. Vielleicht können Sie zwei Splits (eine von den Betreibern, eine von den Variablen) verschachteln

+0

Obwohl nicht die genaue Lösung, gab mir die Idee, die funktioniert! Vielen Dank! Ich werde den Hauptbeitrag für die Lösung bearbeiten! – user677786

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

Sie an einer Wortgrenze geteilt könnte mit \ b

+0

Haben Sie es versucht? Du wirst ein Problem haben. – tchrist

+0

OK, ich gebe es zu, ich habe es in .NET getestet und es hat funktioniert. Das Entfernen der leeren Einträge sollte trivial sein, und das Entfernen der Leerzeichen in der Zeichenfolge wird sicherlich einfach mit einem .replaceAll ausgeführt, bevor die Regex angewendet wird. –

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); 
     } 
    } 

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

-3

Man könnte auch so etwas wie tun:

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

Es behandelt weiße Flächen und Worte variabler Länge und erzeugt Das Array:

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