2010-01-25 6 views
1

J'essaie de créer une méthode qui prend un paramètre String et renvoie ensuite un tableau de chaînes bidimensionnel de noms et de valeurs de paramètres.Java - Liste des paramètres de Tokenize

protected final String[][] setParams (String parms) { 
    String[][] params; 
    int i = 0; 
    Pattern p = Pattern.compile(NEED_REGEX_HERE); 
    Matcher m = p.matcher(parms); 

    params = String[m.groupCount()][2]; 

    while (m.find()) { 
     params[i][0] = m.group(i).subString(0,m.group(i).indexOf('=')); 
     params[i][1] = m.group(i).subString(m.group(i).indexOf('=')); 
     i++; 
    } 

    return params; 
} 

Quelques exemples d'entrée seraient (entre guillemets):

"Name=Ryan;\;Name=John" 
"Name=Ryan;Name=John" 
"Name=Ryan" 
"Name=Ryan;Index=1" 

Ainsi, un ";" est le délimiteur de la liste et l'opérateur d'affectation "=" indique un paramètre valide ie. "\" est une valeur de rejet. Fondamentalement, je suis à la recherche d'une regex qui me permettra de le faire, ou si quelqu'un peut en fournir une, une solution plus élégante.

+0

Avez-vous envisagé de retourner une carte > à la place? – MAK

Répondre

1

Deux parties doivent travailler pour les exemples donnés:

String[] keyValuePairs = line.split(";"); 
for (String keyValuePair:keyValuePairs) { 
    if (isThrowAwayParameter(keyValuePair)) { 
    handleThrowAwayParameter(); 
    } else { 
    String[] keyAndValue = keyValuePair.split("="); 
    String key = keyAndValue[0]; 
    String value = keyAndValue[1]; 
    handleKeyAndValue(key, value); 
    } 
} 
+0

Je ne sais pas pourquoi j'essaie toujours de trop compliquer les choses. Merci. Cela a fonctionné parfaitement. Je suis passé à une liste de tableaux de chaînes pour gérer le dimensionnement dynamique, mais merci beaucoup. – binarymelon

0

Il y a assez de trucs dans cela que vous feriez mieux d'utiliser une bibliothèque pré-écrite (par exemple, l'analyse des formulaires d'option "-h, --help, foo = bar", etc etc). Il y a beaucoup de bibliothèques construites pour faire cela. Une recherche rapide a trouvé une courte liste here. Si vous voulez vraiment l'écrire vous-même, je vais juste essayer de diviser chaque option cmd-line par le "=", avec des messages d'erreur copieux et amicaux pour toutes les commandes malformées que vous obtiendrez.

+0

Vous en pensez vraiment trop sur le contrôle que j'ai sur mon entrée. Je retire ces lignes d'un fichier et je les envoie à un csv conditionnellement en fonction des paramètres définis. – binarymelon

2

Si vous étiez encore curieux au sujet de la version regex (je sais que vous avez déjà marqué une réponse) ... ce serait quelque chose comme ceci:

Pattern p = Pattern.compile("(\\w+)=(\\w+);?"); 
Matcher m = p.matcher(myString); 
while(m.find()) { 
    System.out.println("name[" + m.group(1) + "] = value[" + m.group(2) + "]"); 
} 

Cela présume que les noms et les valeurs sont uniquement constitués de caractères de mot (alphanumériques). Le point-virgule avec un quantificateur "optionnel" est en fait inutile dans ce cas car cela sautera heureusement des choses qu'il ne comprend pas.

0

Si les noms de paramètres sont uniques, vous pouvez utiliser la classe Propriétés:

Properties p = new Properties(); 
p.load(new StringReader(parms.replaceAll(";", "\n")));