需求:在母串 @"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];
}
[0, 上一匹配位置),確保向左推進。NSMakeRange(0, length)。此邏輯可正確找出所有匹配位置 (如示例輸出位置 16, 10, 5, 0),適用於任意子串查找場景。