Splitter sur un espace en prenant en compte les phrases avec ""

a marqué ce sujet comme résolu.

Bonjour,

j'ai essayé de rechercher sur internet, mais je ne sais pas vraiment comment exprimer celà en anglais donc je n'ai pas trouver grand chose.

Actuellement je fait un simple str.split(" "), mais j'aimerais que sur une ligne comme celle-ci sheet "Feuille 1", ça me sépare en deux, or avec mon split ça me le fait en 3 parties puisqu-il y a un espace entre le Feuille et le 1.

Je ne sais donc pas trop comment m'y prendre.

Précision: Je programme en Java

En vous remerciant, et joyeux Noël à toutes et à tous.

il "suffit" de faire un parseur linéaire :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
public List<String> smartSplit(String baseStr, char separator){
    List<String> result = new LinkedList<>();
    StringBuilder buffer = new StringBuilder();
    bool insideQuote = false;
    for(char c: baseStr){
        if(c != separator || insideQuote){
            buffer.append(c);
        }elseif(c == separator){
             result.append(buffer.build());
             result = new StringBuilder(); 
        }

        if(c == '"'){
            insideQuote = !insideQuote;
        }

    }
    return result
}
1
2
3
>>> import re
>>> re.split(' |(".*")', 'sheet "Feuille 1"')
['sheet', None, '', '"Feuille 1"', '']

C'est en python, pas en Java, mais ça doit fonctionner pareil avec (soit tu trouves un espace, dans ce cas la tu split, soit tu trouves un ", dans ce cas tu prends tout jusqu'à la suivante)

1
2
//java.lang.String.split() 
public String[] split(String regex)

Suffit juste de supprimer les vides/None et de modifier un poil la regex pour avoir ce que tu veux.

+0 -0

Solution de AmarOk:

1
2
3
4
5
6
7
String[] split = line.split(" |(@.*@)");

sheet @Feuille 0@ asd
Split: sheet
Split: 
Split: 
Split: asd

Solution de yoch:

1
2
3
4
5
6
String[] split = line.split("@[^@]*@|\\S+");

sheet @Feuille 0@ asd
Split: 
Split:  
Split:  

j'ai remplacer les " par des @, car je ne savais pas si c'est à cause de ça du fait que java ne supporte pas les '. Mais aucun des deux ne me donne le résultat escompté, ai-je fais une faute ?

Pour ta version de la solution de AmarOk, j'imagine que ça ne fonctionne pas parce que le méthode split en Java ne retourne pas les groupes de capture (alors que c'est le cas en Python).

Pour ta version de la solution de yoch, tu utilises split alors qu'il utilise findall. Malheureusement, il ne semble pas y avoir d'équivalent à findall en Java. Tu peux t'inspirer de cette question sur Stack Overflow pour t'en bricoler un.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte