2016-10-17 11 views
1

私はすべての非数字文字で与えられた入力を分割するこの簡単なプログラムを書いています。文字列の間違った出力を分割する

public class Fileread { 
    public static void main(String[] args) throws IOException { 
    //Declarations 
    String[] temp; 
    String current; 

    //Execution 
    BufferedReader br = new BufferedReader(new FileReader("input.txt")); 
    while ((current = br.readLine()) != null) { 
     temp = current.split("\\D"); //Splitting at Non Digits 
     for (int i = 0; i < temp.length; i++) { 
     System.out.println(temp[i]); 
     } 
    } 
    } 
} 

これはINPUT.TXTです:

hello1world2 
world3 
end4of5world6 

は出力:

1 




2 





3 



4 

5 




6 

なぜこれほど多くの余分なスペースが表示されるのですか?私は間にスペースを入れずに、それぞれの番号を別々の行に印刷する必要があります。これをどうすれば解決できますか?

+7

使用 '\\ D +'パターンを参照してください。しかし、文字列が非数字で始まる場合、先頭の空の要素は保持されます。 –

答えて

1
//Declarations 
     String[] temp; 
     String current; 

     //Execution 
     BufferedReader br = new BufferedReader(new FileReader("d://input.txt")); 
     while ((current = br.readLine()) != null) { 
      temp = current.split("\\D+"); //Splitting at Non Digits 
      for (int i = 0; i < temp.length; i++) { 
       if (!temp[i].equalsIgnoreCase("")) { 
        System.out.println(temp[i]); 
       } 
      } 
     } 
+0

それは働いた! temp {i} .equals( "")を置くとうまくいきません。しかし、私が!temp [i] .equalsIgnoreCase( "")を置くとうまくいきます。違いは何ですか?説明できますか? –

+0

私の悪い...それは**!temp [i] .equals( "")**のために働いています...それを試していない...とにかく、ありがとう:) –

4

各桁で分割されています。

、1つの区切り文字として数字以外の文字列を扱う代わりに

temp = current.split("\\D+"); 

を指定します。プラス記号を追加すると、パターンは1つ以上の連続した非数字文字と一致します。

0

JavaのString#splitメソッドは、2つの区切り文字の間に現れる各ポイントのトークンを作成します。 s.split(",")は、次の出力が生成され、間に何もないと連続して表示されます,区切りので

String s = "a,b,c,,,f"; 

:次の例を考えてみましょう

{"a", "b", "c", "", "", "f"} 

あなたはこの配列内の2つの空白の文字列があるに気づくでしょう。連続するコンマの各ペアの間に現れるトークンを表すために空白が挿入されます。基本的には、文字列はa,b,c,(blank),(blank),fとして扱われます。

この解決方法は、連続する区切り文字を単一の区切り文字として扱うことです。さて、あなたの引数がsplitであることは、実際には正規表現リテラルであることを覚えておくことが重要です。ですから、一の以上の連続した区切り文字に一致するようにエンジンを伝え、そして単一のスプリット・ポイントとして扱うために+貪欲正規表現量指定子を含めることができます。上記の例

s.split(",+") 

、これは今、次の(SANを生み出します空白文字列):

{"a", "b", "c", "f"} 

あなたは\\D+を使用して、あなたの正規表現に同様の手法を適用することができます。要するに

1

\Dで文字列を分割

.replaceFirst("^\\D+","").split("\\D+") 

を使用するには、(非数字文字のマッチングパターン)あなたが時間で単一の非桁の文字と一致し、かつその時に文字列を破る意味しますchar。あなたは文字のチャンクに分割する必要がある場合、あなたは複数の連続文字を一致させる必要があり、あなたのケースで、あなただけの\\D+数量詞を追加する必要があります。

ただし、文字列の先頭に数字以外の文字が含まれている場合は、インデックス0に空の要素が残ります。この問題を回避するには、の部分文字列を分割パターンで先頭から削除します。

最終溶液は

List<String> strs = Arrays.asList("hello1world2", "world3", "end4of5world6"); 
for (String str : strs) { 
    System.out.println("---- Next string ----"); 
    String[] temp = str.replaceFirst("^\\D+","").split("\\D+"); 
    for (String s: temp) { 
     System.out.println(s); 
    } 
} 

ではonline Java demo

関連する問題