Quelle est la façon recommandée d'analyser une ligne de commande ressemblant à Shell en Java. De sorte que je ne veux pas dire traiter les options lorsqu'elles sont déjà sous forme de tableau (par exemple, la manipulation "-x" et telle), il existe des charges de questions et de réponses à ce sujet déjà.
Non, je veux dire le fractionnement d'un Chaîne de commande complète dans "jetons". J'ai besoin de convertir une chaîne telle que: p> ... dans la liste / la matrice: p> i ' m actuellement faisant une scission sur WhitSpace, mais cela ne peut évidemment pas gérer les citations et les espaces échappés. P> (la manipulation de la caisse est la plus importante. Les espaces échappés seraient gentils à avoir) P> Remarque: ma chaîne de commande est l'entrée d'une interface Web de type shell. Il n'est pas construit à partir de principal (chaîne [] args) code> p> p>
3 Réponses :
Construire les args [] Retour dans une chaîne, puis Tokenize à l'aide de 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); }
Ce dont vous auriez besoin est de mettre en place un automate fini. Vous auriez besoin de lire le caractère de chaîne par caractère et de trouver l'état suivant en fonction de votre caractère suivant ou précédent.
Par exemple, un " code> indique le début d'une chaîne, mais s'il est précédé d'un
\ code> laisse l'état actuel inchangé et lit jusqu'à la prochaine jeton qui vous emmène à l'état suivant. de
C'est à dire. essentiellement dans votre exemple, vous auriez read string -> read number
^ - - - |
Eh bien, c'est assez facile à construire (et j'ai dans le passé, pour d'autres situations), mais j'espérais déjà une bibliothèque déjà corrigée. En ce qui concerne la raison, je ne suis pas gros construire les commandes eux-mêmes (c'est là -X et tels qui entrent, et ils pourraient bien faire dans ma candidature), mais je suis d'abord construire la coquille elle-même, où les utilisateurs de puissance entrent dans les chaînes de commandes via une interface Web.
Peut-être qu'il y a une bibliothèque pour ce que vous voulez, mais je ne suis pas au courant de suggérer. Mais si vous allez construire une telle coquille et que la mise en œuvre est facile de construire comme vous le dites, je recommanderais de le construire, que dépendent d'une autre bibliothèque car vous construirez pour ajouter des choses au besoin (plus / moins fonctionnalité, débogage, etc.)
Il prend en charge correctement les escapades, donc Bash -C 'echo "\" échappé' \ '' 'Single' '' 'Single' '' '' '' '' '' '' '' "" code> est jetonisé dans
[Bash, -C , echo "\" a échappé 'single' citation \ ""] code>. p>
La plupart de ces bibliothèques de ligne de commande ne seraient-elles pas résolues ce problème? Vous pourriez simplement regarder leur source.
@tietytyt aussi loin que je connais que ces bibliothèques ne traitent que les arguments une fois qu'ils ont été séparés par la coquille. Ils sont pour les commandes de construction, pas des coquilles.
Comment diviseriez-vous les éléments suivants?:
Ceci est "un exemple" code>. C'est à dire. Comment traiteriez-vous une citation d'ouverture précédée d'un caractère d'espace non blanc?
@Lonenebula "this", "est", "un exemple"
En supposant que vous souhaitez que les mêmes règles que l'utilisation de Shell utilise, Ceci est "un exemple" b> PAR analyser Cet exemple B> et ISAN B>
J'aurais aussi besoin d'une libérisation pratique pour cela, quelque chose comme "Shellwords" est pour Ruby ( ruby-doc.org/stdlib-1.9.3/libdoc/shellwords/rdoc/... ) est emballé dans la distribution par défaut.
Dupliqué possible de Diviser une commande contenant une chaîne contenant une commande paramètres -line dans une chaîne [] dans Java