【问题标题】:Ignore escaped double quote characters swift迅速忽略转义的双引号字符
【发布时间】:2021-09-24 08:08:51
【问题描述】:
我正在尝试使用 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}))?$"
【问题讨论】:
标签:
regex
swift
escaping
nspredicate
nsregularexpression
【解决方案1】:
在 Swift 常规字符串文字中,您需要对斜杠进行双重转义以定义 literal 反斜杠:
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 页面上的正则表达式元字符表,了解应该以这种方式转义哪些正则表达式转义。
请注意 常规字符串文字 中使用的正则表达式转义(在上表中)和 字符串文字转义序列 之间的区别,您可以检查,例如,在Special Characters in String Literals:
字符串字面量可以包含以下特殊字符:
- 转义的特殊字符
\0(空字符)、\\(反斜杠)、\t(水平制表符)、\n(换行)、\r(回车)、\"(双引号)和\'(单引号)
- 任意 Unicode 标量值,写为
\u{n},其中 n 是 1-8 位十六进制数(Unicode 在下面的 Unicode 中讨论)
因此,在常规字符串文字中,"\"" 是写为字符串文字的" 字符串,您不必为正则表达式引擎转义双引号,所以@ 987654338@ 字符串文字正则表达式模式足以匹配字符串中的 " 字符。但是,"\\\"",表示\" 文字字符串的字符串文字也将匹配" char,尽管您已经可以看到这个正则表达式模式是多么冗余。此外,"\n"(一个 LF 符号)匹配换行符的方式与 "\\n" 相同,因为 "\n" 是换行符的文字表示,"\\n" 是在 ICU 正则表达式转义表中定义的正则表达式转义.
在原始字符串文字中,\ 只是文字反斜杠。