Javaでの文字列の複数のスペースでの分割(引用符内の単語を除く)


import java.util.ArrayList;
import java.util.List;
public class StringSplitExample {
    public static void main(String[] args) {
        String input = "This is a sample \"string\" with multiple     spaces";
        List<String> words = new ArrayList<>();
        boolean insideQuotes = false;
        StringBuilder wordBuilder = new StringBuilder();
        for (char c : input.toCharArray()) {
            if (c == '\"') {
                insideQuotes = !insideQuotes;
            } else if (c == ' ' && !insideQuotes) {
                if (wordBuilder.length() > 0) {
                    words.add(wordBuilder.toString());
                    wordBuilder = new StringBuilder();
                }
            } else {
                wordBuilder.append(c);
            }
        }
        if (wordBuilder.length() > 0) {
            words.add(wordBuilder.toString());
        }
// 分割された単語の表示
        for (String word : words) {
            System.out.println(word);
        }
    }
}

上記のコードでは、与えられた文字列 input を文字列全体を走査しながら処理しています。insideQuotes フラグは、現在引用符の内部にいるかどうかを示すために使用されます。wordBuilder は、単語を構築するための一時的なバッファです。

文字列が引用符で囲まれている場合、insideQuotestrue に設定されます。引用符が閉じられると、insideQuotesfalse に切り替わります。

文字列を一文字ずつ処理しながら、以下のルールに従って単語を分割します:

  1. もし文字が引用符 " の場合、insideQuotes フラグを反転させます。
  2. もし文字がスペース ' ' の場合、かつ insideQuotes フラグが false の場合、現在の単語を words リストに追加します。
  3. 上記の条件に当てはまらない場合、文字を現在の単語に追加します。

最後に、wordBuilder に残っている最後の単語を words リストに追加します。

上記のコードを実行すると、次の結果が表示されます:

This
is
a
sample
"string"
with
multiple
spaces