使用NSPredicate结合Regex匹配以Test开头字符串出错,求原因及解法
问题分析与解答
1. 代码错误原因
NSPredicate的MATCHES操作符要求正则表达式完全匹配整个字符串,你写的^Test仅能匹配开头是"Test"且后续无任何内容的字符串,因此只有纯"Test"能匹配成功,其他带后续字符的目标字符串都会判定为不匹配。
2. 正确实现方式
要匹配所有以"Test"开头的字符串(无论后续是否有内容),需修改正则表达式,允许"Test"之后出现任意数量的任意字符(包括0个),使用^Test.*即可:
let tests = ["Testhello", "Car", "a@b.com", "Test", "Test 123"] // .* 表示匹配任意数量的任意字符(包括0个) let pattern = "^Test.*" let predicate = NSPredicate(format: "SELF MATCHES %@", pattern) for test in tests { let eval = predicate.evaluate(with: test) print("\(test) - \(eval)") }
修正后输出结果
Testhello - true Car - false a@b.com - false Test - true Test 123 - true
如果需要匹配包含换行在内的所有字符,可以把正则改成^Test[\s\S]*,不过.*在默认场景下已能覆盖绝大多数需求(匹配除换行外的任意字符)。
内容的提问来源于stack exchange,提问作者user1046037
相关产品推荐
相关产品推荐

