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
相关产品推荐
相关产品推荐

