首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Objective-C NSString 反向查找子串位置:正確使用 NSBackwardsSearch 避免遺漏匹配

     編輯:程式設計綜合問答

需求:在母串 @"w is w is w" 中查找所有子串 @"w" 的位置。原代碼使用 NSBackwardsSearch 但範圍計算錯誤,導致漏掉中間的 w。

原代碼缺陷分析

NSRange range = [motherstr rangeOfString:sonstr]; // 首次正向查找,找到第一個 w
while (range.location != NSNotFound) {
    // ...
    NSRange temp = NSMakeRange(range.location + range.length, 
                               motherstr.length - (range.location + range.length));
    range = [motherstr rangeOfString:sonstr options:NSBackwardsSearch range:temp]; // 錯誤:反向搜尋但範圍是「當前之後」
}
  • 首次正向查找得到第一個 w (位置 0)。
  • 後續迴圈使用 NSBackwardsSearch 在「當前位置之後」的範圍反向查找,邏輯矛盾:反向查找應從「當前位置之前」或「字串末尾」開始。
  • 導致跳過中間匹配,只能找到首尾。

正確反向遍歷邏輯

從字串末尾開始反向查找,每次將搜尋範圍縮小到「上一個匹配位置之前」:

NSString *motherstr = @"a is a , so a not equal b";
NSString *sonstr = @"a";

// 1. 初始範圍:整個字串,從末尾向前搜
NSRange range = [motherstr rangeOfString:sonstr 
                                 options:NSBackwardsSearch 
                                   range:NSMakeRange(0, motherstr.length)];

while (range.location != NSNotFound) {
    NSLog(@"Found at: %@", NSStringFromRange(range));
    
    // 2. 下一次搜尋範圍:從開頭到「當前匹配位置之前」
    NSUInteger newLength = range.location; // 不包含當前匹配字符
    NSRange nextRange = NSMakeRange(0, newLength);
    
    // 3. 繼續反向搜尋
    range = [motherstr rangeOfString:sonstr 
                             options:NSBackwardsSearch 
                               range:nextRange];
}

關鍵點

  1. 統一使用 NSBackwardsSearch:從右向左掃描,天然避免重複與遺漏。
  2. 範圍動態縮小:每次搜尋範圍為 [0, 上一匹配位置),確保向左推進。
  3. 初始範圍覆蓋全串:NSMakeRange(0, length)。

此邏輯可正確找出所有匹配位置 (如示例輸出位置 16, 10, 5, 0),適用於任意子串查找場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved