You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何查找字符串中子串的独立完整匹配/第二次出现范围

问题原因

Swift的range(of:)方法默认从字符串开头检索,返回第一个匹配到的子串范围。你的原字符串中45 minutes的尾部刚好包含5 minutes子串,所以优先匹配到了该片段,而非后面独立出现的目标子串。

方案1:直接查找子串第二次出现的范围

如果明确需要取第二次匹配的结果,可以先定位第一次匹配的结束位置,再从该位置往后检索第二次匹配:

let example = "45 minutes. 5 minutes"
let target = "5 minutes"

// 定位第一次匹配范围
guard let firstRange = example.range(of: target) else {
    // 无匹配时的自定义处理
    return
}
// 从第一次匹配结束的位置往后检索
let afterFirstRange = example[firstRange.upperBound...]
guard let secondRangeInSubstring = afterFirstRange.range(of: target) else {
    // 无第二次匹配时的自定义处理
    return
}
// 转换为原字符串的完整范围
let targetRange = example.range(secondRangeInSubstring, in: afterFirstRange.startIndex...)

// 验证输出
print(example[targetRange!]) // 输出:5 minutes(对应你需要的第二个片段)

方案2:完整单词匹配(更适配你的场景)

如果你要的是独立作为完整单词出现的5 minutes,避免匹配到其他单词内部的子串(比如本例中45里的5属于数字串的一部分,不是独立单词),可以直接加正则匹配选项一步到位:

let example = "45 minutes. 5 minutes"
let target = "5 minutes"
// \\b 是正则的单词边界标识,仅匹配前后为非单词字符的目标子串
if let targetRange = example.range(of: "\\b\(target)\\b", options: .regularExpression) {
    print(example[targetRange]) // 直接输出独立的第二个"5 minutes"
}

内容的提问来源于stack exchange,提问作者Will

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:45:05