在NSString中查找子字符串的所有位置(不仅仅是第一个)

for*_*est 32 iphone xcode substring nsstring ios

字符串中有一个子字符串多次出现.我用rangeOfString,但似乎它只能找到第一个位置.如何找到子串的所有位置?

NSString *subString1 = @"</content>";
NSString *subString2 = @"--\n";
NSRange range1 = [newresults rangeOfString:subString1];
NSRange range2 = [newresults rangeOfString:subString2];
int location1 = range1.location;
int location2 = range2.location;
NSLog(@"%i",location1);
NSLog(@"%i",location2);
Run Code Online (Sandbox Code Playgroud)

Pen*_*One 78

您可以使用rangeOfString:options:range:并设置第三个参数超出第一个参数的范围.例如,您可以执行以下操作:

NSRange searchRange = NSMakeRange(0,string.length);
NSRange foundRange;
while (searchRange.location < string.length) {
    searchRange.length = string.length-searchRange.location;
    foundRange = [string rangeOfString:substring options:0 range:searchRange];
    if (foundRange.location != NSNotFound) {
        // found an occurrence of the substring! do stuff here
        searchRange.location = foundRange.location+foundRange.length;
    } else {
        // no more substring to find
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这假设子串外观不重叠,考虑到这个问题,这是合理的.一般来说,这可能不是一个合理的假设.考虑一下干草堆"ababab".针"abab"出现在位置0和位置2(在位置0处与针重叠).上述算法将忽略位置2. (5认同)
  • 将文本"+ foundRange.length"更改为文本"+1"会以适当的方式修改算法. (3认同)

Abh*_*ain 5

斯威夫特 3.0

查找子串的所有位置 i

let text = "This is the text and i want to replace something"
let mutableAttributedString = NSMutableAttributedString(string: text)

var searchRange = NSRange(location: 0, length: text.characters.count)
var foundRange = NSRange()
while searchRange.location < text.characters.count {
    searchRange.length = text.characters.count - searchRange.location
    foundRange = (text as NSString).range(of: "i", options: NSString.CompareOptions.caseInsensitive, range: searchRange)
    if foundRange.location != NSNotFound {
        // found an occurrence of the substring! do stuff here
        searchRange.location = foundRange.location + foundRange.length
        mutableAttributedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.red, range: foundRange)
    }
    else {
        // no more substring to find
        break
    }
}

//Apply
textLabel.attributedText = mutableAttributedString;
Run Code Online (Sandbox Code Playgroud)

而这个输出——

在此处输入图片说明