无法在swift中进行正则表达式匹配 - iOS

时间:2017-04-16 14:17:10

标签: ios regex swift

以下是我的代码:

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)'

我认为我正在以错误的方式形成正则表达式,对修复有任何想法吗?

实际上我的意图是避免用户从键盘输入任何其他语言输入,而是普通键盘中的所有键。 如果有更好的方法,请告诉我。 感谢。

1 个答案:

答案 0 :(得分:1)

问题在于你的正则表达式。您需要转义正则表达式标识符,否则,编译器会尝试从中生成一个公式并失败。 如果您只想接受带有特殊字符的英文字符,请使用此

  

[A-ZA-Z0-9 [] {}#%\ ^ * + = _ \ |〜&LT;&GT;€£¥• - / :;()$&安培; @ \”。?! \']

这一次只匹配一个字符。如果要匹配一个或多个字符,即整个字符串,请在表达式的末尾使用+(一个或多个匹配)或*(零或多个匹配)。

  

[A-ZA-Z0-9 [] {}#%\ ^ * + = _ \ |〜&LT;&GT;€£¥• - / :;()$&安培; @ \”。?! \'] +

这将匹配一个或多个字符(非空字符串)。 将来,您可以使用此网站Regexr,这将验证您的正则表达式。