忽略转义的双引号字符 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.
中定义的转义
在原始字符串文字中,\
只是文字反斜杠。
我正在尝试使用 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}
, wheren
is a 1–8 digit hexadecimal number (Unicode is discussed in Unicode below)
所以,在常规字符串文字中,"\""
是一个写成字符串文字的"
字符串,你不必转义双精度正则表达式引擎的引号,因此 "\""
字符串文字正则表达式模式足以匹配字符串中的 "
字符。但是,"\\""
表示 \"
文字字符串的字符串文字也将匹配 "
字符,尽管您已经可以看出此正则表达式模式有多么多余。此外,"\n"
(LF 符号)以与 "\n"
相同的方式匹配换行符,因为 "\n"
是换行符字符的文字表示,而 "\n"
是正则表达式在 ICU 正则表达式转义 table.
在原始字符串文字中,\
只是文字反斜杠。