2016-05-25 2 views
-4

私の質問は簡単ですが、splitメソッドなどを使って文字列を改行し、次の行の最初の要素で分割することは可能ですか?例えばJAVA split string by改行+次の行開始文字

(JAVAを使用して)、私は1つの文字列としてこれを持っている:

T | TRUE | 2016年5月25日午後04時21分59秒は
E | 1 | 2 | 3 | 3 | X | J
L | 2 | 3
L | 43 | JJJ
E | 2 | 33
H | 24343 | IADS

私は改行とEでそれを分割したい|ので、その結果は次のようになります。

最初の文字列:
T | TRUE | 2016年5月25日午後04時21分59秒

第2ストリング:
E | 1 | 2 | 3 | 3 | X | J
L | 2 | 3
L | 43 | JJJ

3番目の文字列:
E | 2 | 33
H | 24343 | IADS

これを実行する方法はありますか?感謝! ありがとう!

+5

これまでに何を試しましたか?これは、string.split()へのかなり単純な呼び出しのいくつかでなければなりません。 – bstockwell

+0

私はこれを試しました:sp​​lit( "E |")); .split( "\\ r?\\ n" + "E |")とすべての可能なバリアント –

+0

私はあなたがしたいことを本当に得られません。 1つの文字列があります。あなたはそれを "改行"で分割します。文字列のリストを各行に1つずつ取得します。あなたはそれ以上の分割をしません。その代わりに、あなたが一緒に「属している」文字列を連結することによって構築された、新しい文字列をまとめることになります。 – GhostCat

答えて

0

私が知っている限り、あなたが分割すると言った文字を分割して保持する分割方法はありません(この場合は\nE|)。私が理解しているとおり、E|は残したいが、\nをダンプしたいと思う。この問題を解決するには、これを行うための独自の方法を書くことができます。

public static void main(String[] args) { 
    String string = "T|True|25.05.2016 16:21:59\n" + 
        "E|1|2|3|3|X|J\n" + 
        "L|2|3\n" + 
        "L|43|JJJ\n" + 
        "E|2|33\n" + 
        "H|24343|IADS"; 

    String[] stringArray = splitTheString(string, new String[] {"E|", "\n"}); 
    for(String s : stringArray) { 
     System.out.println(s); 
    } 
} 

メインメソッドでは、文字列変数を作成し、それに文字列を割り当てます。 (String string = "your string here")。それを整理しておくために、私は別のsplitTheString()の方法をとることにしました。 2つの引数をとります:最初に分割したい文字列と2番目に文字列を含む配列を分割したいと思います。

方法については、TreeListを使用します。データは自動的に順序付けられた方法で保存され、重複は保存されません。 また、ArrayListも使用します。両方とも入力を省くためにインポートできますが(import java.util.*)、この例ではこれを実行しませんでした。

public static String[] splitTheString(String string, String[] regex) { 
    java.util.TreeSet<Integer> list = new java.util.TreeSet<>(); 
    list.add(0); 
    list.add(string.length()); 
    int fromIndex; 
    int toIndex; 

[OK]をクリックして、何が起こっているのかを説明するために(ここのような)いくつかの点でメソッドを分割します。最初に、私はTreeSetオブジェクトを作成しました。見つかったインデックス番号を格納するために使用します。サブストリング\nE|の位置のインデックス番号を見つけようとします。インデックス番号0を追加しました(開始点が必要です;文字列は0から始まり、0から始まる)。また、文字列のサイズを追加しました(文字列の最後のインデックスはサイズ-1です)。

for(String s : regex) { 
     toIndex = 0; 
     while(toIndex >= 0) { 
      fromIndex = toIndex + 1; 
      toIndex = string.indexOf(s, fromIndex); 
      if(toIndex >= 0) list.add(toIndex); 
     } 
    } 

SPLIT - >この次の部分では、拡張for-loop(またはforeach-loop)を使用しました。配列 "regex"のすべての文字列に対して、文字列をsという変数に格納します。したがって、最初にsE|になり、それは\nになります。 for -loopにはwhile -loopがあり、toIndexが0より小さい(したがって否定的)までループします。どうして?私はストリングindexOfメソッドを使用しています。これは、検索している文字列のインデックスを返します(引数で指定したインデックスから開始します)。文字列が見つからない場合は、-1を返します。これらの値はすべてリストに格納されます。 (彼らが正しい順序で自動的にされている覚えていますか?)

java.util.ArrayList<String> stringList = new java.util.ArrayList<>(); 
    int count = 0; 
    while(list.size() > 1) { 
     stringList.add(string.substring(list.pollFirst(), list.first())); 
     if(stringList.get(count).equals("\n")) stringList.remove(count); 
     else count++; 
    } 

SPLITは - >これは、我々がArrayList -objectを作成しています。あなたの弦を保存するために使用されます。そこで、ArrayListのadd()メソッドを使用して、substringをstringListに追加します。部分文字列を取得するには、Stringsメソッドsubstring(fromIndex, toIndex)を使用します。これは、fromIndexからtoIndexまでの部分文字列を返します。インデックス番号はリスト(TreeMap)から取得されます。 pollFirst()-method(最初の値を削除して返します)とfirst() -method(最初の値を削除しないで返しますが、最初の値を削除したので、新しい最初の値は 部分文字列が\nと等しくないかどうかもチェックします。別の文字列値として保存されているブレークを望みません。

String[] stringArray = new String[count]; 
    count = 0; 
    for(String s : stringList) { 
     stringArray[count] = s.replace("\n", ""); 
     count++; 
    } 
    return stringArray; 
} 

すべての部分文字列がstringList-objectに追加されました。使用する配列であれば、それらを配列に追加するだけです(配列に追加する前に、 "\ n"を文字列から削除するので、追加しなかった改行に悩まされる必要はありません自分自身。

この回答が参考になりましたように願っています。不明な点がある場合や、この回答を改善するための提案がある場合は、ご意見ください。