忽略逃脱双引号字符迅速

Jac*_*ing 3 regex escaping nspredicate nsregularexpression swift

我正在尝试使用NSPredicate和正则表达式验证电话号码.唯一的问题是当设置正则表达式Swift认为我试图逃避它的一部分由于反斜杠.我怎么能绕过这个?

我的代码如下:

let phoneRegEx = "^((\(?0\d{4}\)?\s?\d{3}\s?\d{3})|(\(?0\d{3}\)?\s?\d{3}\s?\d{4})|(\(?0\d{2}\)?\s?\d{4}\s?\d{4}))(\s?\#(\d{4}|\d{3}))?$"
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 5

在Swift中,您仍然需要双重转义字符串文字中的斜杠以定义文字反斜杠:

let phoneRegEx = "^((\\(?0\\d{4}\\)?\\s?\\d{3}\\s?\\d{3})|(\\(?0\\d{3}\\)?\\s?\\d{3}\\s?\\d{4})|(\\(?0\\d{2}\\)?\\s???\\d{4}\\s?\\d{4}))(\\s?\\#(\\d{4}|\\d{3}))?$"
Run Code Online (Sandbox Code Playgroud)

请参阅ICU正则表达式页面上的正则表达式元字符表,以查看应以这种方式转义正则表达式转义符.

请注意正则表达式转义(在上表中)和字符串文字转义序列之间的区别,您可以检查字符串文字中的特殊字符:

字符串文字可以包含以下特殊字符:

  • 转义的特殊字符\0(空字符),\\(反斜杠),\t(水平制表符),\n(换行符),\r(回车符),\"(双引号)和\'(单引号)
  • 任意Unicode标量值,写为\u{n},其中n是1-8位十六进制数字(Unicode在下面的Unicode中讨论)

所以,"\"""作为字符串写入文本字符串,而你没有逃脱正则表达式引擎双引号,这样"\""字符串字面正则表达式是足以匹配"字符串中的字符.但是,"\\\""字符串文字重复\"文字字符串也将匹配"char,尽管您已经可以看到这个正则表达式模式有多余.此外,"\n"(一个LF符号)以与换行符相同的方式匹配换行符"\\n",这"\n"是换行符char的文字表示,并且"\\n"是ICU正则表达式转义表中定义的正则表达式转义符.