gpt4 book ai didi

regex - 快速忽略转义的双引号字符

转载 作者:搜寻专家 更新时间:2023-10-31 22:15:46 25 4
gpt4 key购买 nike

我正在尝试使用 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}))?$"

最佳答案

在 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 上的正则表达式元字符 表页面以查看应以这种方式转义哪些正则表达式。

请注意正则表达式转义(在上表中)与 常规字符串文字 中使用的字符串文字转义序列 之间的区别,您可以在Special Characters in String Literals :

String literals can include the following special characters:

  • The escaped special characters \0 (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)

因此,在常规字符串文字中,"\"" 是一个写成字符串文字的" 字符串,而您没有转义正则表达式引擎的双引号,因此 "\"" 字符串文字正则表达式模式足以匹配字符串中的 " 字符。然而,"\\\"",一个字符串文字 repesenting \" literal string 也将匹配 " 字符,虽然你已经可以看到如何此正则表达式模式是多余的。此外,"\n"(LF 符号)以与 "\\n" 相同的方式匹配换行符,如 "\n" 是换行符的文字表示,"\\n" 是 ICU 正则表达式转义表中定义的正则表达式转义。

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

关于regex - 快速忽略转义的双引号字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30260034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com