2013-05-23 13 views
6

Qual è il modo consigliato di analizzare una riga di comando simile a shell in Java. Con ciò non intendo l'elaborazione delle opzioni quando sono già in forma di array (ad esempio la gestione di "-x" e così via), ci sono un sacco di domande e risposte a riguardo.Suddivisione di una riga di comando in Java

No, intendo la divisione di una stringa di comando completa in "token". Ho bisogno di convertire una stringa come:

user 123712378 suspend "They are \"bad guys\"" Or\ are\ they? 

... alla lista/array:

user 
123712378 
suspend 
They are "bad guys" 
Or are they? 

Attualmente sto solo facendo una spaccatura su spazio bianco, ma che ovviamente non riesco a gestire le virgolette e gli spazi sfuggiti.

(trattamento preventivo è più importante spazi Escaped sarebbe bello da avere.)

Nota: La mia stringa di comando è l'ingresso da un'interfaccia web conchiglia. Non è costruito da main(String[] args)

+0

La maggior parte di quelle librerie della riga di comando non ha risolto questo problema? Potresti solo guardare la loro fonte. –

+1

@tieTYT Per quanto ne so, queste librerie trattano solo gli argomenti una volta separati dalla shell. Sono per la costruzione di comandi, non di shell. –

+0

Come divideresti quanto segue ?: 'Questo è" un esempio "'. Cioè come tratteresti una virgoletta di apertura preceduta da un carattere di spazio non bianco? –

risposta

1

Quello che ti serve è implementare un automa finito. Dovresti leggere la stringa carattere per carattere e trovare lo stato successivo a seconda del tuo personaggio successivo o precedente.
Ad esempio un " indica l'inizio di una stringa ma se è preceduto da un \ lascia lo stato corrente invariato e legge fino al token successivo che porta allo stato successivo.
I.e. essenzialmente nel tuo esempio si sarebbe

read string -> read number 
    ^- - - | 

È ovviamente avrebbe bisogno di definire tutti gli stati e i caratteri speciali che influenzano o meno influenzano il tuo stato.
Ad essere sincero non sono sicuro del motivo per cui si desidera fornire tale funzionalità all'utente finale.
Tradizionalmente tutti i programmi cli accettano input in un formato standard -x or --x or --x=s ecc.
Questo formato è ben noto a un utente tipico ed è semplice da implementare e verificare come corretto.
Tradizionalmente, se è necessario fornire un input più "flessibile" per l'utente, è consigliabile creare una GUI. Questo è quello che suggerirei.

+2

Beh, è ​​abbastanza facile da costruire (e ho in passato, per altre situazioni), ma speravo che qualche libreria l'avesse già sistemata. Per quanto riguarda il motivo, non sto sviluppando i comandi da soli (è qui che -x e simili arrivano, e potrebbero fare bene nella mia applicazione), ma sto costruendo la shell stessa, dove gli utenti esperti inseriscono le stringhe di comando tramite un'interfaccia web. –

+0

Forse c'è una libreria per quello che vuoi, ma non sono a conoscenza di una cosa da suggerire. Ma se hai intenzione di costruire una tale shell e l'implementazione è facile da costruire come dici, ti consiglierei di costruirla , che dipendono da un'altra libreria come si costruisce per aggiungere le cose secondo necessità (più/meno funzionalità, debug, ecc.) – Cratylus

0

costruire l'args [] in una stringa, quindi tokenize utilizzando regexp:

public static void main(String[] args) { 
    String commandline = ""; 
    for(String arg : args) { 
     commandline += arg; 
     commandline += " "; 
    } 
    System.out.println(commandline); 

    List<String> list = new ArrayList<String>(); 
    Matcher m = Pattern.compile("([^\"]\\S*|\".+?\")\\s*").matcher(commandline); 
    while (m.find()) 
     list.add(m.group(1)); // Add .replace("\"", "") to remove surrounding quotes. 


    System.out.println(list); 
} 

L'ultima parte ho preso da here.

0

ArgumentTokenizer da DrJava analizza la riga di comando in un modo Bourne shell e le sue derivate.

Supporta correttamente gli escape, pertanto bash -c 'echo "\"escaped '\''single'\'' quote\""' viene tokenizzato in [bash, -c, echo "\"escaped 'single' quote\""].

Problemi correlati