Java字串切割問題(split)

有一個字串如下

String test = "aaa<=tr=>bbbccdee<=td=>ddf";

希望用split傳出

arr[0] = "tr";

arr[1] = "td";

的結果。

目前做出來都是相反的結果。

String[] arr = test.split("<=.*?=>.*?");

想請教一下正規表示式(Regular Expression)要怎麼做?

ps:用loop的方式來做效能會很差,就不考慮用loop的方式。

已更新項目:

程式如下,

結果

ans

ans1

請問split中的正規表示式該要怎麼寫呢?

2 個已更新項目:

public static void main(String[] a) {

String[] array = getStrArray("abcdefgh<=ans=>ijklmnopqrst<=ans1=>uvwxyz");

for (int i = 0; i < array.length; i++) {

System.out.println(array[i]);

}

}

3 個已更新項目:

public static String[] getStrArray(String str) {

return str.split("正規表示式語法");

}

4 個已更新項目:

最後附上api

String[] split(String regex)

Splits this string around matches of the given regular expression.

網址如下

http://download.oracle.com/javase/6/docs/api/java/...

5 個已更新項目:

目前想了一個最囧的做法....囧

private static String[] getStrArray(String data) {

return data.replaceAll("^[\\w]*<=", "").replaceAll("=>[\\w]*$", "").split("=>[\\w].*?<=");

}

4 個解答

評分
  • sponge
    Lv 6
    9 年前
    最佳解答

    發問大大,能否更詳細描述您的問題?

    String test = "aaa<=tr=>bbbccdee<=td=>ddf";

    String[] arr = test.split("<=.*?=>.*?");

    System.out.print(arr[0]+" "+arr[1]);

    這三行跑出:

    aaa bbbccdee

    與您原先預期插在哪裡?

    2011-02-22 21:02:41 補充:

    一開始您split裏的表示式,目標設定錯誤

    split是將比對到的字串移除

    因此您的問題有兩種寫法:

    1. (^.*?<=)|(=>.*?\s*?.*?<=)|(=>.*$)

    ^.*?<= 指從字串開頭,不限個數任意字元,直到"<="

    在此它移除了"aaa<="

    =>.*?\s*?.*?<= 指從"=>"後不限個數任意字元,到"<="止

    在此它移除了"=>bbbccdee<="

    請注意\s為處理換行等特殊字元

    此段只寫 =>.*?<= 將無法處理中間夾雜\n的字串

    =>.*$ 指從"=>"始不限個數任意字元到字串末尾

    在此它移除了"=>ddf"

    程式寫法: arr=test.split("(^.*?<=)|(=>.*?\\s*?.*?<=)|(=>.*$)");

    2. (\A.*?<=)|(=>.*?\s*?.*?<=)|(=>.*\Z)

    \A.*?<= 作用與 ^.*?<= 相同,其中\A代表輸入的開始

    =>.*\Z 與 =>.*$ 作用相同,其中\Z為輸入的結束

    程式寫法: arr=test.split("(\\A.*?<=)|(=>.*?\\s*?.*?<=)|(=>.*\\Z)");

    另外特別說明一點

    此表示式分離出來的字串陣列

    [0]是一個空字串,[1]後就您要的"tr"、"td"

    雖然不是從[0]開始,但還是可以達成取出<=...=>內的字串

    希望以上回答對您有幫助!

    2011-02-23 11:20:41 補充:

    針對'.'無法代替'\n'和'\r'等字元

    有一個比較好且精簡的處理方式

    split("(^(?s).*?<=)|(=>(?s).*?<=)|(=>(?s).*$)")

    加(?s)可使'.'真的代表任意字元包含'\n'、'\r'

    \A\Z的版本將'^'、'$'改'\\A'、'\\Z'填入程式即可

  • Cola
    Lv 5
    9 年前

    也可以用下面的方式

    String[] arr = test.substring(test.indexOf("<=")+2,test.lastIndexOf("=>")).split("=>.*?<=");

    有試過用test = "=>" + test + "<=";

    String[] arr = test.split("<=.*?=>");

    會傳回長度3的陣列,第一個會是空白字串

    最上面的方式就可以傳回您想要的

  • 匿名使用者
    9 年前

    private static String[] getRegularArray(String data)

    {

    String[] temp = data.split("[a-zA-Z]+<=");

    data = "";

    for(int i = 0; i < temp.length; i++)

    {

    data += temp[i];

    }

    temp = data.split("[=>]");

    return new String[] { temp[0], temp[2] };

    }

    2011-02-21 09:26:32 補充:

    頂多就是這樣...要再簡短的話就要麻煩其他高手了~

  • 9 年前

    他要 tr 跟 td ..

還有問題?馬上發問,尋求解答。