web-dev-qa-db-fra.com

Java String.split () Regex

J'ai une chaîne:

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

Je veux diviser la chaîne sur tous les opérateurs, mais inclure les opérateurs dans le tableau, de sorte que le tableau résultant ressemble à:

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

J'ai ceci actuellement:

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

C'est assez proche, ça donne:

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

Y a-t-il quelque chose que je puisse faire pour que les opérateurs à plusieurs caractères apparaissent dans le tableau comme je le souhaite?

Et comme question secondaire qui n'est pas aussi importante, y a-t-il un moyen dans l'expression régulière de couper l'espace blanc autour des lettres?

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

Cela devrait le faire. Tout est bien stocké dans res.

37
IchBinKeinBaum
str.split (" ") 
res27: Array[Java.lang.String] = Array(a, +, b, -, c, *, d, /, e, <, f, >, g, >=, h, <=, i, ==, j)
16
user unknown
    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);
        }
    }

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

4
dat_clover

Vous pouvez fractionner sur une limite de Word avec\b

1
Andrew Morton

Pouvez-vous inverser votre regex ainsi divisé par les caractères non opérationnels?

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

Cela ne renvoie évidemment pas les variables du tableau. Vous pouvez peut-être entrelacer deux divisions (une par les opérateurs, une par les variables)

0
Chris White