全文検索用にユーザー様がキーワードをGoogle検索のように、1つや、複数入力した場合、各キーワードを分割する方法を探しています。

半角及び全角スペースで区切られた下記の様な文字列を分割したいのですが、
正規表現がわかりません。

分割条件

  1. 半角、全角、スペース区切り。
  2. 但し、ダブルクォーテーションで括られている文字列は中にスペースやタブなどの特殊文字が入っていても一つの文字列として扱う。
    従って、
    『ABC あいう"え "" おか きく"けこ -"おはよう"』を分割すると、
    『ABC』
    『あいう"え "" おか きく"けこ』 ← 途中に ""があるが、" "と間にスペースがないので連続した文字列と判断。
    『 -"おはよう"』
    の3つになります。

元の文字列の例

 きた A+!^"*-= " P" 雨 "" 雪 "   "み  ず た に"    abc 時間123-"門`限"  "やぶるな

Java文字列リテラル表現では:

String moto = " きた A+!^\"*-= \" P\" 雨 \"\" 雪 \"   \"み  ず た    に\"    abc 時間123-\"門`限\"  \"やぶるな";

分割後の各文字列

  • きた
  • A+!^"*-= "
  • P" 雨 "" 雪 "
  • "み  ず た に"
  • abc
  • 時間123-"門限"
  • "やぶるな ←わざと最後のダブルクォーテーションを外してあります。

下記正規表現でできる?かもしれませんが、このコードをJAVAへ記述すると、
実行以前の問題で、eclipsで記述文字列が正しくないエラーで赤く指摘状態になります。
(恐らく\を追加したりしてエスケープ処理をしないといけないのですが、\/"の前にいくつ追加しても、文字列が正しくないというエラーで赤く指摘状態になります。)

Pattern p = Pattern.compile("\s+("(?:"|[^"])*"?|[^"]\S*)");
String[] result = p.split(moto);
for (int i=0; i<result.length; i++){
    System.out.println("[" + result[i] + "]");
}

質問 1

正規表現は、正しいでしょうか?

質問 2

Javaに記述するには、\を追加などして、どのように記述すれば、Eclipseが文字列が不正というエラーをださなくなるでしょうか?

やった見ている多数のパターンの一例ですが、

Pattern p = Pattern.compile("\\s+(\"(?:\"|[^\"])*\"?|[^\"]\S*)");

下記の様に \ を入れたところ、eclipsで赤文字で、文字列エラーがなくなりました。

String[] result = test.split("\\s+(\"(?:\"|[^\"])*\"?|[^\"]\\S*)");
for (int i=0; i<result.length; i++){
    out.print("[" + result[i] + "]");
}

但し、正規表現が悪いようで、下記の様に分割できませんでした。
test = "雨 "み ず"";
 ↓ 分割後
[雨 "み ず"]