2016-07-02 8 views
0

文字列を区切り文字で分割しようとしていますが、区切り文字を引用符で囲み無視することができます。例えば。文字列を分割するためのStrTokenizerの動作が一貫していません

"foo; bar; 'foo; bar'"

は、区切り与えられた3つの文字列にスリットれるべき ';'そして、引用文字「:

foo bar foo; bar

私は以下のようにStrTokenizerを使用していますが、"foo; bar; 'foo; bar'"のために働くようではありませんが、それは"'foo; bar'; foo; bar;"

のために働くん誰が間違っているかを説明することはできますか?

import org.apache.commons.lang3.text.StrTokenizer; 
public class Main { 
    public static void main(String[] args) { 

     String x= "foo; bar; 'foo; bar'"; 

     StrTokenizer tokens= new StrTokenizer(x, ';', '\''); 

     for (String token : tokens.getTokenArray()) { 
      System.out.println(token.trim()); 
     } 
     // Prints: 
     // foo 
     // bar 
     // 'foo 
     // bar' 

     /* --------- */ 
     // THIS IS OK: 
     x= "'foo; bar'; foo; bar"; 

     tokens= new StrTokenizer(x, ';', '\''); 

     for (String token : tokens.getTokenArray()) { 
      System.out.println(token.trim()); 
     } 
     // Prints: 
     // foo; bar 
     // foo 
     // bar 
    } 
} 

答えて

1

デフォルト引用されたエリアで区切り以外の任意の文字(でもスペース)(そう; 'quote'がOKではありませんが、;'qupte'で結構です)を付けることができないように見えます - (端部との間のスペースので、少し奇妙です引用符と区切り文字の間に何らかの問題が発生していないようで、バグかもしれません。明示的にトリミングする必要がある文字を設定

は(も、あなたは、もはやあなたの印刷文でtrim()を追加する必要があります)この問題を解決するようだ:

StrTokenizer tokens = new StrTokenizer(x, ';', '\''); 
tokens.setTrimmerMatcher(StrMatcher.spaceMatcher());// <- add this line 

にトリムするには:スペース、タブ、改行や改ページの使用StrMatcher.splitMatcher()

+0

ありがとうございました!私は、そのような(共通の)タスクがそのような反直感的なコーディング(IMHO)を必要とすることに少し驚いています。私が見つけたほとんどの解決策は、これを回避しようとした正規表現を含んでいます。ところで、私はStrTokenizerに固執する必要はありません、もし私がより良いオプションに切り替えることを嬉しく思います... – dariober

+0

うーん、より良いオプションはあなたが実際に何をしているかに依存する可能性があります。最初は私はCSVファイルを解析しようとしていますが、CVSパーサーのほうが良いツールかもしれませんが、そのようなファイルの区切り文字にはトリミングが必要な不要な文字は含まれていません(したがって、 )。しかし、私が気づいていないあなたのタスクを単純化することができる、より良いCVSパーサーがあるかもしれません。 – Pshemo

+0

いいえ、CSVファイルではありません。私はちょうどコマンドライン引数のように見える文字列を分割する必要があります。 StrTokenizerは、上記のテストケースに踏み込むまで私が望むものを正確にやったように見えましたが、これは本当に基本的なものです。 – dariober

関連する問題