以下是我的代码:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let prospectiveText = ((textField.text ?? "") as NSString).replacingCharacters(in: range, with: string)
if prospectiveText.validateAsPerRegExpression(regExpression: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789[]{}#%^*+=_\\|~<>€£¥•-/:;()$&@\".,?!\'") == false {
return false
}
return true
}
extension String {
func validateAsPerRegExpression(regExpression: String) -> Bool {
let floatExPredicate = NSPredicate(format:"SELF MATCHES %@", regExpression)
return floatExPredicate.evaluate(with: self)
}
}
获得以下崩溃:
***由于未捕获的异常'NSInternalInconsistencyException'终止应用程序,原因:'无法进行正则表达式匹配, 原因:无法打开模式U_REGEX_INVALID_RANGE(字符串e,模式 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 [] {}#%^ * + = _ \ |〜&LT;&GT;€£¥• - / :;()$&安培; @”,“。?! 案例0,佳能0)'
我认为我正在以错误的方式形成正则表达式,对修复有任何想法吗?
实际上我的意图是避免用户从键盘输入任何其他语言输入,而是普通键盘中的所有键。 如果有更好的方法,请告诉我。 感谢。
答案 0 :(得分:1)
问题在于你的正则表达式。您需要转义正则表达式标识符,否则,编译器会尝试从中生成一个公式并失败。 如果您只想接受带有特殊字符的英文字符,请使用此
[A-ZA-Z0-9 [] {}#%\ ^ * + = _ \ |〜&LT;&GT;€£¥• - / :;()$&安培; @ \”。?! \']
这一次只匹配一个字符。如果要匹配一个或多个字符,即整个字符串,请在表达式的末尾使用+(一个或多个匹配)或*(零或多个匹配)。
[A-ZA-Z0-9 [] {}#%\ ^ * + = _ \ |〜&LT;&GT;€£¥• - / :;()$&安培; @ \”。?! \'] +
这将匹配一个或多个字符(非空字符串)。 将来,您可以使用此网站Regexr,这将验证您的正则表达式。