1

文字列を操作しようとしています。私の場合、次の文字列があります。

String test ="/mnt/sdcard/Download/images.jpeg|/mnt/sdcard/Download/images.jpeg|/mnt/sdcard/Download/images-1.jpeg|/mnt/sdcard/Download/images-2.jpeg|";

この文字列には、Android エミュレーターの画像の 4 つのパスが含まれています。ご覧のとおり、すべてのパスは「 | 」文字で区切られています。私がやりたいことは十分に単純です。「 | 」文字のないすべてのパスを検索する for ループを作成する必要があり、ループごとに、作成されたパスを削除する必要がありますが、この場合は「 | 」文字を使用します。コードを実装しましたが、何が間違っているのか理解できません。実際、画像パスは正しく削除されますが、「 | 」文字は削除されません。たとえば、最初のループの後、テスト文字列は次のようになります。

|/mnt/sdcard/Download/images.jpeg|/mnt/sdcard/Download/images-1.jpeg|/mnt/sdcard/Download/images-2.jpeg|

先頭に「 | 」文字があるため、正しくありません。ここに私のコードがあります。

for(int i=0; i<=3; i++) {
    //find the characters number before you find the first " | " character available
    int indexOfStatic = test.indexOf("|"); 
    //this find the string that we want remove from the test string that contains all paths
    int indexOfStaticToRemove = test.indexOf("|")+1; 

    String testPath = test.substring(0, indexOfStatic); //this is the correct path of the image
    String testPathToRemove = test.substring(0, indexOfStaticToRemove); //this is the path with the " | " character that we want remove from the test string
    Log.i("PATH TO REMOVE",""+testPathToRemove);

    //here i remove the path with the " | " character. I use the replaceFirst method because if the "test" string contains two equals paths (how in my example) i want to replace only one at time for avoid crash during the loop
    test = test.replaceFirst(testPathToRemove,"");
    Log.i("TEST REPLACE",""+test); //Replace the first | with nothing
}

どちらが問題なのかはわかりませんが、実際には難しくないはずです。

4

6 に答える 6

4

あなたは問題を見落としています、使用してくださいsplit()

    String[] imagePaths = test.split("\\|");
    for (String string : imagePaths) {
        System.out.println(string);
    }

}

これにより、必要なパスが得られます。

    /mnt/sdcard/Download/images.jpeg
    /mnt/sdcard/Download/images.jpeg
    /mnt/sdcard/Download/images-1.jpeg
    /mnt/sdcard/Download/images-2.jpeg
于 2013-10-08T08:11:29.423 に答える
2

誰も本当の質問に答えていないようです。

replaceFirst()メソッドのドキュメントを見てください:

http://docs.oracle.com/javase/6/docs/api/java/lang/String.html

正規表現を使用してパーツを置き換えます。しかし|、正規表現ではORステートメントです。それはあなたが持っている混乱を引き起こしています

于 2013-10-08T08:11:53.057 に答える
0

はい、最良のオプションが使用されます

test.split("\\|") 

必要な配列を取得するか、 | の代わりに他の記号を使用できます。(正規表現で OR として使用されるため)replaceFirst では "#" または "$" のように

    String test ="/mnt/sdcard/Download/images.jpeg#/mnt/sdcard/Download/images.jpeg#/mnt/sdcard/Download/images-1.jpeg#/mnt/sdcard/Download/images-2.jpeg#";
        for(int i=0; i<=3; i++) {
            //find the characters number before you find the first " | " character available
            int indexOfStatic = test.indexOf("#"); 
            //this find the string that we want remove from the test string that contains all paths
            int indexOfStaticToRemove = test.indexOf("#")+1; 

            String testPath = test.substring(0, indexOfStaticToRemove); //this is the correct path of the image
            String testPathToRemove = test.substring(0, indexOfStaticToRemove); //this is the path with the " | " character that we want remove from the test string
            System.out.println("PATH TO REMOVE"+testPathToRemove);

            //here i remove the path with the " | " character. I use the replaceFirst method because if the "test" string contains two equals paths (how in my example) i want to replace only one at time for avoid crash during the loop
            test = test.replaceFirst(testPathToRemove,"");
            System.out.println("TEST REPLACE"+test); //Replace the first | with nothing

}

次の出力が得られます

PATH TO REMOVE/mnt/sdcard/Download/images.jpeg#
TEST REPLACE/mnt/sdcard/Download/images.jpeg#/mnt/sdcard/Download/images-1.jpeg#/mnt/sdcard/Download/images-2.jpeg#
PATH TO REMOVE/mnt/sdcard/Download/images.jpeg#
TEST REPLACE/mnt/sdcard/Download/images-1.jpeg#/mnt/sdcard/Download/images-2.jpeg#
PATH TO REMOVE/mnt/sdcard/Download/images-1.jpeg#
TEST REPLACE/mnt/sdcard/Download/images-2.jpeg#
PATH TO REMOVE/mnt/sdcard/Download/images-2.jpeg#
TEST REPLACE
于 2013-10-08T08:34:36.083 に答える
0
test = test.replaceFirst(testPathToRemove,"");

メソッド「replaceFirst」の最初のパラメーターは文字列ではなく、正規表現です。他の人が言ったように、コードの代わりに以下のコードを使用できます。とても簡単です。

test.split("\\|");

それでもコードを使用したい場合は、以下のコードを使用できます。

test = test.replaceFirst(testPathToRemove.replaceAll("\\|", "\\\\\\|"), "");
于 2013-10-08T09:04:40.003 に答える
0

問題の原因は、次の行が原因です。

test = test.replaceFirst(testPathToRemove,"");

ここで replaceFirst は最初の引数で正規表現を受け取ります。あなたの場合は '/mnt/sdcard/Download/images.jpeg|' になります。「|」があることに注意してください およびその '|' OR演算として推論されるため、文字列を置き換えるために何でもかまいません。そのため、その行を実行すると、test は空の文字列になります。

代わりに部分文字列をもう一度使用して、残りの文字列を取得できます。

public static void main(String []args){
    String test = "/mnt/sdcard/Download/images.jpeg|/mnt/sdcard/Download/images.jpeg|/mnt/sdcard/Download/images-1.jpeg|/mnt/sdcard/Download/images-2.jpeg|";
    for(int i=0; i<=3; i++) {
            //find the characters number before you find the first " | " character available
            int indexOfStatic = test.indexOf("|"); 
            //this find the string that we want remove from the test string that contains all paths
            int indexOfStaticToRemove = test.indexOf("|")+1; 

            String testPath = test.substring(0, indexOfStatic); //this is the correct path of the image
            String testPathToRemove = test.substring(0, indexOfStaticToRemove); //this is the path with the " | " character that we want remove from the test string
            System.out.println("PATH: "+testPath);
            System.out.println("PATH TO REMOVE: "+testPathToRemove);


            //here i remove the path with the " | " character. I use the replaceFirst method because if the "test" string contains two equals paths (how in my example) i want to replace only one at time for avoid crash during the loop
            test = test.substring(indexOfStaticToRemove,test.length());
            System.out.println("PATH TO REPLACE: "+test);
            System.out.println();
    }
 }
于 2013-10-08T08:21:45.707 に答える
0

split メソッドを使用する必要があります。

String[] paths = test.split("\\|");
for (int i=0; i<paths.length; i++) {
  //in paths[i] you have the i-esim path
}
于 2013-10-08T08:08:30.723 に答える