この種のブラケット [ ] で囲まれていない場合、文字列を空白で分割するにはどうすればよいですか
したがって、文字列" book [new interesting book] buy it "
は分割する必要があります
book
new interesting book
buy
it
また
book
[new interesting book]
buy
it
ありがとうございました!
正規表現である必要がありますか?スペースの前にある角かっこがいくつあるかを数えて、そのスペースを改行マークに置き換える必要があるかどうかを判断するだけで、1回の反復でそれを行うことができます。
String data="book [new [interesting] book] buy it";
StringBuilder buffer=new StringBuilder();
int bracketCounter=0;
for (char c:data.toCharArray()){
if (c=='[') bracketCounter++;
if (c==']') bracketCounter--;
if (c==' ' && bracketCounter==0)
buffer.append("\n");
else
buffer.append(c);
}
System.out.println(buffer);
外:
book
[new [interesting] book]
buy
it
String.split()
角かっこ内のスペースと角かっこ外のスペースを区別するのが難しいため、ここで使用するのは困難です。代わりに、Matcher.find()
トークンを使い果たすまで、文字列に対して継続的に反対します。
List<String> tokens = new ArrayList<String>();
Pattern p = Pattern.compile("\\s*(\\[.*\\]|[^\\s]+)\\s*");
Matcher m = p.matcher(" book [new interesting book] buy it ");
while (m.find()) {
tokens.add(m.group());
}
System.out.println(tokens);
// Prints: [ book , [new interesting book] , buy , it ]
上記の正規表現は、先頭と末尾の空白を無視し、次のものを取得します。(1)角かっこ内にある場合はすべて、または(2)非スペースのシーケンス。
少し改善するために、@cheekenの応答を少し変更しました。コードのフォーマットのため、回答に含めることにしました。
List<String> tokens = new ArrayList<String>();
Pattern p = Pattern.compile("\\s*(\\[.*\\]|[\\S]*)\\s*");
Matcher m = p.matcher(" book [new interesting book] buy it ");
while (m.find()) {
if (!m.group().matches("\\s*")) {
tokens.add(m.group());
}
}
パターンの 2 番目の部分を変更して、彼の否定の代わりに \S の事前定義されたクラスを使用し、空の文字列に対してパターンをテストして、彼の答えが許可する最初と最後のスペースを含めないようにしました。