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

Swift:如何用正则表达式实现用户名数组的非前缀匹配搜索?

解决Swift用户名任意位置搜索的问题

我明白你的需求啦——原来的搜索逻辑只匹配用户名的开头部分,现在需要改成任意位置包含匹配,不管搜索文本出现在用户名的哪个位置,只要存在就算匹配,包括_*$这类特殊字符。

只需要修改filter里的判断条件就行,这里给你两种可靠的实现方式:

方式一:统一转小写后检查包含关系

这种方式直观易懂,把用户名和搜索文本都转成小写,然后判断用户名是否包含搜索文本:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    let lowercasedSearchText = searchText.lowercased()
    // 替换原来的prefix判断为contains检查
    serachingNames = userArray.filter { $0.lowercased().contains(lowercasedSearchText) }
    searching = true
    theTableView.reloadData()
}

方式二:使用range(of:options:)做不区分大小写匹配

这种方式不需要手动转小写,直接利用Swift字符串的range(of:)方法,通过.caseInsensitive选项实现忽略大小写的包含检查,代码更简洁:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    serachingNames = userArray.filter { userName in
        // 只要搜索文本在用户名中存在(忽略大小写),就返回true
        userName.range(of: searchText, options: .caseInsensitive) != nil
    }
    searching = true
    theTableView.reloadData()
}

这两种方式都能实现你的预期效果:输入1234会匹配到asdf1234,输入_*$也能匹配到包含这些特殊字符的asdf_*$jkljö,因为它们会检查整个用户名字符串的任意位置,而不仅仅是开头。

如果你的用户数组特别大,担心性能问题,可以提前把所有用户名的小写版本缓存起来,这样每次搜索时不用重复转小写,但一般情况下上面的代码已经足够应对大多数场景啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 09:37:38