1

重複の可能性:
一重引用符または二重引用符で囲まれていない場合に、スペースを使用して文字列を分割するための正規表現

次のように文字列を分割するにはどうすればよいですか。

String args = "\"file one.txt\" filetwo.txt some other \"things here\"";

引用符を尊重しながら引数/パラメータに入れますか?

したがって、上記の例では、引数は次のように分割されます。

args[0] = file one.txt
args[1] = filetwo.txt
args[2] = some
args[3] = other
args[4] = things here

split(" ") の使用方法は理解していますが、引用符で囲まれた用語を結合したいと考えています。

4

2 に答える 2

5

正規表現を使用する必要がなく、入力にネストされた引用符が含まれていないと仮定すると、文字列文字に対する1 回の反復でこれを実現できます。

String data = "\"file one.txt\" filetwo.txt some other \"things here\"";

List<String> tokens = new ArrayList<String>();
StringBuilder sb = new StringBuilder();

boolean insideQuote = false;

for (char c : data.toCharArray()) {

    if (c == '"')
        insideQuote = !insideQuote;

    if (c == ' ' && !insideQuote) {//when space is not inside quote split..
        tokens.add(sb.toString()); //token is ready, lets add it to list
        sb.delete(0, sb.length()); //and reset StringBuilder`s content
    } else 
        sb.append(c);//else add character to token
}
//lets not forget about last token that doesn't have space after it
tokens.add(sb.toString());

String[] array=tokens.toArray(new String[0]);
System.out.println(Arrays.toString(array));

出力:

["file one.txt", filetwo.txt, some, other, "things here"]
于 2013-02-01T22:32:18.383 に答える
-1

依存関係の導入に問題がなければ、Apache からCommons cliを使用できます。これにより、コマンド ラインの解析が簡素化され、ユーザーにとってより使いやすくなります。

于 2013-02-01T21:12:20.167 に答える