如何逃避正则表达式字符串

时间:2016-06-29 13:31:19

标签: ios regex swift string

我有以下正则表达式字符串用于确定有效的电子邮件地址(包括特殊字符,例如ö,ê,ī等):

^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$

它在https://regex101.com上作为正则表达式进行了测试。然后我想在我的代码中包含这个字符串,所以我必须逃避它。因此,我最终得到以下字符串:

^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$

现在,当我运行我的代码时:

private static func regexMatch(regex: String, string: String) -> Bool {
    let stringTest = NSPredicate(format:"SELF MATCHES %@", regex)
    return stringTest.evaluateWithObject(string)
}

我的应用崩溃时出现以下错误:

  

***由于未捕获的异常'NSInternalInconsistencyException'终止应用程序,原因:'无法进行正则表达式匹配,原因:无法打开模式U_REGEX_MISSING_CLOSE_BRACKET(字符串scött.hôdśōn@example.com,模式^(([^ &LT;&GT;()[] \;:\ S @ \ “] +([^&LT;&GT;()[] \;:。\ S @ \”] +)。*)|(\ “+ \”))@(([0-9] {1,3}。[0-9] {1,3}。[0-9] {1,3}。[0-9] { 1,3}])|(([a-zA-Z-0-9] +。)+ [a-zA-Z] {2,}))$,case 0,canon 0)'

我的猜测是我以某种方式错误地转义正则表达式字符串。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:0)

应该注意关于实际提高你的正则表达式的评论。有些事情你没有应该逃避,特别是]并且在你不需要时逃避,特别是在.[]"。在你的正则表达式中修复它们之后

^(([^<>()[\].,;:\s@"]+(.[^<>()[\].,;:\s@"]+)*)|(".+"))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9]+.)+[a-zA-Z]{2,}))$

然后逃离特殊字符,我们得到

"/^(([^<>()[\\].,;:\\s@\"]+(.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9]+.)+[a-zA-Z]{2,}))$/"

我怀疑“丢失括号”错误是由于]的不正确转义造成的,这种转义过早地关闭了你的一些交流发电机组。同样,你的帖子上的评论员是正确的,正则表达式本身肯定可以改进

答案 1 :(得分:0)

我将我的正则表达式字符串更新为以下内容,现在它似乎正在运行。

 $scope.notifications = angular.extend($scope.notifications1,$scope.notifications2)