忽略转义的双引号字符 swift

Ignore escaped double quote characters swift

我正在尝试使用 NSPredicate 和正则表达式验证 phone 号码。唯一的问题是当设置正则表达式时 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}))?$"

在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}))?$"

Starting from Swift 5,您可以使用 原始字符串文字 并使用单个反斜杠转义正则表达式:

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}))?$"#

请参阅 ICU Regular Expressions 页面上的 正则表达式元字符 table 以了解应以这种方式转义哪些正则表达式。

请注意正则表达式转义(在上面的table)和字符串文字转义序列之间的区别常规字符串文字 你可以在 Special Characters in String Literals:

查看

String literals can include the following special characters:

  • The escaped special characters [=12=] (null character), \ (backslash), \t (horizontal tab), \n (line feed), \r (carriage return), \" (double quotation mark) and \' (single quotation mark)
  • An arbitrary Unicode scalar value, written as \u{n}, where n is a 1–8 digit hexadecimal number (Unicode is discussed in Unicode below)

所以,在常规字符串文字中,"\""是一个写成字符串文字的"字符串,你不必转义双精度正则表达式引擎的引号,因此 "\"" 字符串文字正则表达式模式足以匹配字符串中的 " 字符。但是,"\\"" 表示 \" 文字字符串的字符串文字也将匹配 " 字符,尽管您已经可以看出此正则表达式模式有多么多余。此外,"\n"(LF 符号)以与 "\n" 相同的方式匹配换行符,因为 "\n" 是换行符字符的文字表示,而 "\n" 是正则表达式在 ICU 正则表达式转义 table.

中定义的转义

在原始字符串文字中,\ 只是文字反斜杠。