1

私の Java アプリケーションは、小さなコマンド ラインを備えています。引数を解析するために、最初に行が読み込まれ、string.split("\\s+"). 引数はname:valueの形式で、通常は名前のどちらにもスペースを含めることは想定されていません。

新しい機能の導入がファイル パスであると想定されているときに、問題が発生しました。パスにスペースが含まれている場合 (エスケープされているかどうかに関係なく)、チョッピング アルゴリズムはもちろんパスを分割します。

Q:ファイル パスを分割 (エスケープ) せずに、文字列を引数の配列に分割できる正規表現は何ですか?


エスケープされたパスは の形式/folder/part1\ part2.txtであると考えていますが、妥当な代替構文も有効です。

より簡単であればstring.split(" ")、同様に受け入れられます。

4

2 に答える 2

0

構文: /folder/part1\ part2.txt:

これを解決するための正規表現には、探しているパターンの前の文字が\. 正規表現は次のようになります(?<!\\)\s+(?<!\\)は後ろの部分、\\は見たくないパターンです。\s+私たちが探しているパターンです - ある種の空間です。この正規表現を Java で使用するには、次のように正しくエスケープする必要がありますstring.split("(?<!\\\\)\\s+")

new File()これは UNIX スタイルのファイル パスで機能します。ファイルをたとえば に渡したい場合は、まだバックスラッシュを削除する必要がある場合があります。


構文の場合"/folder/part1 part2.txt":

これはより普遍的なアプローチかもしれませんが、追加の作業が必要になります。アイデアは、文字列をループし、スペースがエスケープされた部分にない限り、スペースが表示されるたびに前の部分をリストに保存することです。例えば:

List<String> parts = new ArrayList<String>();
boolean escaped = false;
StringBuilder stringBuilder = new StringBuilder();
for(int i = 0; i < string.length(); i++) {
    char c = string.charAt(i);
    if(!escaped && (c == ' ' || c == '\t')) {    // Space in non-escaped part
        parts.add(stringBuilder.toString());     // Put buffer in list
        stringBuilder = new StringBuilder();
    } else if (c == '"')       // Escape sign
        escaped = !escaped;    // Toggle escape status
    else
        stringBuilder.append(c);    // Add char to buffer
}
parts.add(stringBuilder.toString());    // Put the last buffer into the array

必要に応じて、リストを配列に変換できます

String[] args = parts.toArray(new String[parts.size()])

この形式では、UNIX および Windows スタイルのパスを使用できます。結果の配列には、引用符を除いたファイル パスが含まれます。

于 2013-05-11T11:11:40.363 に答える