ダブルクォーテーション含む文字列をスペースで分割するには
全文検索用にユーザー様がキーワードをGoogle検索のように、1つや、複数入力した場合、各キーワードを分割する方法を探しています。
半角及び全角スペースで区切られた下記の様な文字列を分割したいのですが、
正規表現がわかりません。
分割条件
- 半角、全角、スペース区切り。
- 但し、ダブルクォーテーションで括られている文字列は中にスペースやタブなどの特殊文字が入っていても一つの文字列として扱う。
従って、
『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 = "雨 "み ず"";
↓ 分割後
[雨 "み ず"]