【问题标题】: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 正则表达式转义表中定义的正则表达式转义.

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

    【讨论】:

    • 谢谢,我知道有办法做到这一点,但我不太记得了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多