文字列を区切り文字で分割しようとしていますが、区切り文字を引用符で囲み無視することができます。例えば。文字列を分割するための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
}
}
ありがとうございました!私は、そのような(共通の)タスクがそのような反直感的なコーディング(IMHO)を必要とすることに少し驚いています。私が見つけたほとんどの解決策は、これを回避しようとした正規表現を含んでいます。ところで、私はStrTokenizerに固執する必要はありません、もし私がより良いオプションに切り替えることを嬉しく思います... – dariober
うーん、より良いオプションはあなたが実際に何をしているかに依存する可能性があります。最初は私はCSVファイルを解析しようとしていますが、CVSパーサーのほうが良いツールかもしれませんが、そのようなファイルの区切り文字にはトリミングが必要な不要な文字は含まれていません(したがって、 )。しかし、私が気づいていないあなたのタスクを単純化することができる、より良いCVSパーサーがあるかもしれません。 – Pshemo
いいえ、CSVファイルではありません。私はちょうどコマンドライン引数のように見える文字列を分割する必要があります。 StrTokenizerは、上記のテストケースに踏み込むまで私が望むものを正確にやったように見えましたが、これは本当に基本的なものです。 – dariober