4

この種のブラケット [ ] で囲まれていない場合、文字列を空白で分割するにはどうすればよいですか

したがって、文字列" book [new interesting book] buy it "は分割する必要があります

book
new interesting book
buy
it

また

book
[new interesting book]
buy
it

ありがとうございました!

4

4 に答える 4

3

正規表現である必要がありますか?スペースの前にある角かっこがいくつあるかを数えて、そのスペースを改行マークに置き換える必要があるかどうかを判断するだけで、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
于 2012-06-18T18:45:34.220 に答える
2

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)非スペースのシーケンス。

于 2012-06-18T18:47:07.550 に答える
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 の事前定義されたクラスを使用し、空の文字列に対してパターンをテストして、彼の答えが許可する最初と最後のスペースを含めないようにしました。

于 2012-06-18T18:54:32.523 に答える