CommandLine { public static String[] translateCommandline(String toProcess) { if (toProcess == null || toProcess.isEmpty()) { return new String[0]; } final int normal = 0; final int inQuote = 1; final int inDoubleQuote = 2; int state = normal; StringTokenizer tok = new StringTokenizer(toProcess, "\"\' ", true); Vector<String> v = new Vector<>(); StringBuffer current = new StringBuffer(); boolean lastTokenHasBeenQuoted = false; while (tok.hasMoreTokens()) { String nextTok = tok.nextToken(); switch (state) { case inQuote: if ("\'".equals(nextTok)) { lastTokenHasBeenQuoted = true; state = normal; } else { current.append(nextTok); } break; case inDoubleQuote: if ("\"".equals(nextTok)) { lastTokenHasBeenQuoted = true; state = normal; } else { current.append(nextTok); } break; default: if ("\'".equals(nextTok)) { state = inQuote; } else if ("\"".equals(nextTok)) { state = inDoubleQuote; } else if (" ".equals(nextTok)) { if (lastTokenHasBeenQuoted || current.length() != 0) { v.addElement(current.toString()); current = new StringBuffer(); } } else { current.append(nextTok); } lastTokenHasBeenQuoted = false; break; } } if (lastTokenHasBeenQuoted || current.length() != 0) { v.addElement(current.toString()); } if (state == inQuote || state == inDoubleQuote) { throw new RuntimeException("unbalanced quotes in " + toProcess); } String[] args = new String[v.size()]; v.copyInto(args); return args; } private  CommandLine(); static String[] translateCommandline(String toProcess);  }
@Test public void testStandardCommandLine() { String[] args = CommandLine.translateCommandline("git pull --verbose=true"); assertEquals(3, args.length); assertEquals("git", args[0]); assertEquals("pull", args[1]); assertEquals("--verbose=true", args[2]); }
@Test public void testQuotedCommandLine() { String[] args = CommandLine.translateCommandline("\"git\" \"pull\" \"--verbose=true\""); assertEquals(3, args.length); assertEquals("git", args[0]); assertEquals("pull", args[1]); assertEquals("--verbose=true", args[2]); }
@Test public void testQuotedOption() { String[] args = CommandLine.translateCommandline("git pull --verbose=\"true\""); assertEquals(3, args.length); assertEquals("git", args[0]); assertEquals("pull", args[1]); assertEquals("--verbose=true", args[2]); }
@Test public void testQuotedOptionWithASpace() { String[] args = CommandLine.translateCommandline("set user --name=\"Tomitribe Crest\""); assertEquals(3, args.length); assertEquals("set", args[0]); assertEquals("user", args[1]); assertEquals("--name=Tomitribe Crest", args[2]); }