2017-06-19 2 views
1

J'ai une chaîne qui ressemble à ceci:lettres d'analyse et flotte à l'aide du scanner java

"m 535.71429,742.3622 55.71428,157.14286 c 0,0 165,71429, -117,14286 -55,71428, -157,14286 z"

et je veux le scanner de Java pour sortir les chaînes suivantes: "m", "535.71429", "742.3622", "55.71428", "157.14286", "c", ...

ainsi tout séparé par une virgule ou un espace, mais j'ai du mal à le faire fonctionner.

Voici comment mon code ressemble à:

Scanner scanner = new Scanner(path_string); 
scanner.useDelimiter(",||//s"); 
String s = scanner.next(); 
if (s.equals("m")){ 
    s = scanner.next(); 
    point[0] = Float.parseFloat(s); 
    s = scanner.next(); 
    point[1] = Float.parseFloat(s); 
    .... 

mais les cordes qui sortent sont: "m", "", "5", "3", ...

+0

Qu'est-ce que le point [0], point [1]? Est-ce l'endroit où vous essayez de stocker la sortie? – ganeshvjy

+0

oui, je veux enregistrer les valeurs float. –

Répondre

4

I pense que le problème est avec // s. Vous devez utiliser ce modèle:

scanner.useDelimiter("(,|\\s)"); 

modèles Regex:

abc… Letters 
123… Digits 
\d  Any Digit 
\D  Any Non-digit character 
.  Any Character 
\.  Period 
[abc] Only a, b, or c 
[^abc] Not a, b, nor c 
[a-z] Characters a to z 
[0-9] Numbers 0 to 9 
\w  Any Alphanumeric character 
\W  Any Non-alphanumeric character 
{m}  m Repetitions 
{m,n} m to n Repetitions 
*  Zero or more repetitions 
+  One or more repetitions 
?  Optional character 
\s  Any Whitespace 
\S  Any Non-whitespace character 
^…$  Starts and ends 
(…)  Capture Group 
(a(bc)) Capture Sub-group 
(.*) Capture all 
(ab|cd) Matches ab or cd 

Nous utilisons deux \ parce que c'est symbole spécial et | n'est pas

+0

Merci beaucoup! Quelle est la différence entre | et ||? –

+1

@MoritzBurgi accepter la réponse s'il vous a aidé –

+0

'||' n'a pas de signification particulière dans une expression régulière. Je pense que l'expression régulière '(a || b)' cherche un 'a', un' b' et une chaîne emtpy (le vide entre le premier '|' et le second '|'). [regex101] (https://regex101.com/) avertit avec le message suivant: * "Un alternateur à cette position tronque effectivement le groupe, rendant les autres jetons au-delà de ce point inutiles" *. –

0

Si vous voulez que la sortie soit des chaînes , le Float.parseFloat(s); est inutile pour votre problème. Votre tableau est-il un tableau flottant? Parce que si c'est le cas, vous ne devriez pas avoir de sortie mais un NumberFormatException, car la chaîne "m" ne peut pas être analysée dans un flottant.

En outre, pour résoudre le problème des valeurs uniques, vous pouvez utiliser un StringBuilder qui construit vos numéros et ignore les lettres et les virgules. Une utilisation particulière des lettres devrait être mise en œuvre. Enfin, si ce n'est pas absolument nécessaire, utilisez double au lieu de float. C'est tellement plus sûr et pourrait vous sauver d'autres problèmes dans votre programme!

+0

Je veux analyser un fichier SVG. Je recherche alternativement une lettre, puis sauvegardez les valeurs flottantes qui suivent. Je pense que je dois construire une vérification si le jeton analysé est composé de lettres ou de chiffres. –