2016-01-13 29 views
6

は私のようなたとえば、複数の行を含むtest.txtというファイルを持っている:Java文字列は英数字と改行で分割されますか?

"h3llo, @my name is, bob! (how are you?)" 

"i am [email protected]@@@@" 

私は、出力は次のようになりますので、ArrayListのにすべての英数字と新しい行を分割したい

output = ["h", "llo", "my", "name", "is", "bob", "how", "are", "you", "i", "am", "fine"] 

は今のところ、私は

output.split("\\P{Alpha}+") 

としかし、これはArrayListの中で最初の場所にコンマを追加しているようだいくつかの理由で私のテキストを分割しようとした、と再改行を空の文字列で置き換えます。

output = ["", "h", "llo", "my", "name", "is", "bob", "how", "are", "you", "", "i", "am", "fine"] 

これを修正する別の方法はありますか?ありがとうございました!

-

編集:どのように私はそれが新しい行を無視することを確認することができますか?

+0

英数字またはAlphaだけでしょうか? –

+0

なぜ 'hllo'は出力で1つのトークンであると予想されますが、' 3'は取り除かれますか? –

+0

@sashok_bg英数字 – evelyn

答えて

0

正規表現を使用して、結果をArrayListに入れてください(それで最後にデータを入れたいのですが)removeIfを使用して空の文字列を削除してください。

String input = "\"h3llo, @my name is, bob! (how are you?)\"\n\n\"i am [email protected]@@@@\""; 

ArrayList<String> arrayList = new ArrayList<>(Arrays.asList(input.split("\\P{Alpha}+"))); 
arrayList.removeIf(""::equals); 

System.out.println(arrayList); 

結果:

[H、LLO、私、名前、あなたは、どのように、ボブです、私、午前、細かい]

2

JavaのString.split()行動がありますかなり混乱しています。はるかに良い分割ユーティリティはGuavaSplitterです。彼らのdocumentationString.split()との問題について詳細に入る:

分割文字列のJavaユーティリティに組み込まれていくつかの風変わりな振る舞いを持つことができます。たとえば、String.splitは末尾のセパレータを黙って破棄し、StringTokenizerはちょうど5つの空白文字を尊重します。

クイズ:",a,,b,".split(",")戻り...

  1. "", "a", "", "b", ""
  2. null, "a", null, "b", null
  3. "a", null, "b"
  4. "a", "b"
  5. 上記
  6. のなし

正解は上記のどれですか:"", "a", "", "b"。後続の空の文字列だけがスキップされます。これは私がしていないものです。あなたのケースでは

は、この作業をする必要があり:

Splitter.onPattern("\\P{Alpha}+").omitEmptyStrings().splitToList(output); 
+0

特にここでは、 'omitEmptyStrings()'が便利です。 –

0

別の解決策は、のjava.util.regexで正規表現のパッケージを使用することです。*

MatcherとPatternが関係します。あなたの正規表現パターンをテストするための

String input = "h3llo, @my name is, bob! (how are you?)\n"+ 
      "i am [email protected]@@@@"; 

    Pattern p = Pattern.compile("([a-zA-Z]+)"); 
    Matcher m = p.matcher(input); 

    List<String> tokens = new ArrayList<String>(); 
    while (m.find()) { 
     System.out.println("Found a " + m.group()); 
     tokens.add(m.group()); 
    } 

P.S良いツールはhttps://regex101.com/

関連する問題