2014年4月3日 星期四

字串衝浪二 :indexOf, subString

在很多處理字串的情況中,常有需要搜尋某字串片段或是截取某字串片段的處理,參考 String API 中的描述,常用的方法(Method)有:



一、搜尋字串中的某片段字串:

int indexOf(Pattern pattern, [int start])
在原字串中搜尋某指定字串片段(pattern) 第一次出現的位置,也可從指定的起始位置(start)處開始搜尋,最後回傳搜尋到的字串片段起始位置,或是 -1 代表找不到指定的字串片段。

int lastIndexOf(Pattern pattern, [int start])
在原字串中搜尋某指定字串片段(pattern)最後一次出現的位置,也可從指定的起始位置(start)處開始搜尋,最後回傳搜尋到的字串片段起始位置,或是 -1 代表找不到指定的字串片段。


二、截取字串中的某字串片段

String substring(int startIndex, [int endIndex])
從字串中指定的起始位置(startIndex) 開始截取字串片段直到字串結尾,或是直到指定的結束位置(endIndex)


以下是結合上述兩個方法所演示的字串處理範例,目的在於從宣告的字串 code 中,將數字的部份去除只保留英文字母的部份。

main() {
  String code = "3955PVRR65E4AGE29566A04G7540A531YO49A49AAA2O32AARX"
      "AF36A527A2N2AAD6AAG2458A46AA593V22U2300T521A3AKA1A"
      "0Z0CS43F53AA9A1QA6E33TC6A9M9AAA2Y03A5SAF4O131AX4KR"
      "FAAF349Y4A31A87A9027913735B9OR2A9A7RH506248A4173P4";

  int startIndex = 0;
  int endIndex = 0;
  var patternAlphabets = new RegExp("[A-Z]");
  var patternDigitals = new RegExp("[0-9]");
  StringBuffer sb = new StringBuffer();
  do {
    //從 startIndex 開始尋找到以字母為開頭的索引位置
    if ((startIndex = code.indexOf(patternAlphabets , startIndex)) >= 0) {
      //字母為開頭的字串索引位置開始找到以數字為開頭的索引位置
      //因為 startIndex 已經是指到以字母為開頭的位置,所以從下一個位置(startIndex+1)開始找起
      endIndex = code.indexOf(patternDigitals , startIndex+1);
      //將只有字母的字串剪下後寫入到 StringBuffer 中
      sb.write(code.substring(startIndex, endIndex));
      //將下次輪迴的起點設在結束索引的下一個位置(endIndex+1)
      startIndex = endIndex + 1;
    }
    //直到找不到任何以字母為開頭字串後才結束
  } while (startIndex >= 0);

  //印出只有字母字串的結果
  print(sb.toString());
}

輸出:
PVRREAGEAGAYOAAAAOAARXAFAANAADAAGAAAVUTAAKAAZCSFAAAQAETCAMAAAYASAFOAXKRFAAFYAAABORAARHAP

(註:以上範例只為示範 indexOf 及 subString 的用法,非問題的最佳解)

沒有留言:

張貼留言