Swift正则表达式格式?

MLy*_*yck 15 regex pcre ios swift

我熟悉pcre正则表达式,但它们似乎并没有迅速发挥作用.

^([1-9]\d{0,2}(\,\d{3})*|([1-9]\d*))(\.\d{2})?$
Run Code Online (Sandbox Code Playgroud)

验证数字,如1,000,000.00

但是,将此放在我的快速函数中会导致错误.

    extension String {
    func isValidNumber() -> Bool {
        let regex = NSRegularExpression(pattern: "^([1-9]\d{0,2}(\,\d{3})*|([1-9]\d*))(\.\d{2})?$", options: .CaseInsensitive, error: nil)
        return regex?.firstMatchInString(self, options: nil, range: NSMakeRange(0, countElements(self))) != nil
    }
}
Run Code Online (Sandbox Code Playgroud)

"litteral中的转义序列无效"

这当然是因为pcre使用"\"字符,swift解释为逃避(我相信?)

因为我不能只使用我习惯的正则表达式.如何将它们翻译为与Swift代码兼容?

Avi*_*Raj 37

在双引号内,单个反斜杠将被重新作为转义序列.您需要再次转义所有反斜杠,以将其视为正则表达式反斜杠字符.

"^([1-9]\\d{0,2}(,\\d{3})*|([1-9]\\d*))(\\.\\d{2})?$" 
Run Code Online (Sandbox Code Playgroud)

  • 这个答案并不完整。其他一些字符需要单个反斜杠。 (2认同)

Man*_*awa 8

编辑(2022 年 6 月)

从 Swift 5.7 开始,您可以在 Xcode 14.0 Beta 1 或更高版本上使用它,您可以/.../像这样使用:

// Regex type
let regex = /^([1-9]\d{0,2}(\,\d{3})*|([1-9]\d*))(\.\d{2})?$/
Run Code Online (Sandbox Code Playgroud)

编辑(2022 年 12 月):由于这会在内部创建iOS 16 和 macOS 13 中引入的正则表达式,因此最低部署目标必须涵盖该操作系统版本。

优点#"..."#

  • 您的正则表达式模式是在编译时解析的,因此您无需担心程序编译后模式是否有效
  • 如果您的模式无效,编译器会具体告知您哪个部分无效,因为编译错误
  • 应用语法突出显示

所以你的代码看起来像这样:

extension String {
    func isValidNumber() -> Bool {
        let regex = /^([1-9]\d{0,2}(\,\d{3})*|([1-9]\d*))(\.\d{2})?$/
            .ignoresCase()
        return (try? regex.firstMatch(in: self)) != nil
    }
}
Run Code Online (Sandbox Code Playgroud)

原答案

从 Swift 5 开始,你可以#"..."#这样使用,这样你就不需要为 Swift 添加额外的转义序列:

#"^([1-9]\d{0,2}(\,\d{3})*|([1-9]\d*))(\.\d{2})?$"#
Run Code Online (Sandbox Code Playgroud)