【问题标题】:Validating RGB String using regex in Swift在 Swift 中使用正则表达式验证 RGB 字符串
【发布时间】:2020-06-04 11:16:13
【问题描述】:

我一直在尝试找出验证用户条目的最佳方法,该用户条目是一个以逗号分隔的 RGB 值的字符串。它应该只允许没有空格的字符串和格式如 (1,12,123; 225,225,2; 32,42,241...)。

我以前从未使用过正则表达式,但我猜这将是最好的解决方案?我一直在RegexPal 上玩,并且已经让这个字符串工作了:

(#([\da-f]{3}){1,2}(\d{1,3}%?,\s?){3}(1|0?\.\d+)\)|\d{1,3}%?(,\s?\d{1,3}%?){2})

但是,在 Swift 中使用它并不是很幸运。我收到错误“文字中的转义序列无效”。

如果有任何关于在 Swift 中使用该正则表达式的帮助,或者是否有更好的正则表达式字符串/解决方案来验证条目,我们将不胜感激。谢谢!

【问题讨论】:

  • 我不熟悉 Swift,但如果将正则表达式定义为字符串,则可能需要转义反斜杠,因此对于 [\da-f],您可能需要 "[\\da-f]"

标签: ios swift regex validation


【解决方案1】:

您可以在 Swift 中的第一个双引号之前和最后一个双引号之后使用标签,以避免在任何特殊字符之前手动添加反斜杠。关于您使用的正则表达式,它将允许用户输入超过 255 限制的值。

下面改编自 post 的正则表达式会将值限制在 0-255 之间,并允许用户输入 1 个或多个 rgb 值,后跟 ";""; "

#"^\((((([1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])),){2}(([1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]))(;|; )?){1,}\)$"#

extension StringProtocol {
    var isValidRGB: Bool { range(of: #"^\((((([1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])),){2}(([1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]))(;|; )?){1,}\)$"#,
                                 options: .regularExpression) != nil }
}

"(200,55,1)".isValidRGB // true
"(10,99,255; 0,0,10)".isValidRGB // true
"(2,2,2;)".isValidRGB // true
"(2,2,2;2)".isValidRGB // false
"(2,2,2;2,2)".isValidRGB // false
"(2,2,254;0,0,0)".isValidRGB // true
"(2,2,256;0,0,0)".isValidRGB // false

【讨论】:

    【解决方案2】:

    将定义 RegEx 的 Swift 代码添加到问题中。

    另一位发帖人可能已经发现了问题。 (@manzarhaq,您真的应该将您的回复作为答案发布,以便 OP 可以接受它。)

    反斜杠是 Swift 字符串中的一个特殊字符。它告诉编译器下一个字符是一个特殊字符。如果您想要文字反斜杠,则需要连续 2 个反斜杠。所以你的正则表达式字符串可能如下所示:

    let regExStrin = "(#([\\da-f]{3}){1,2}(\\d{1,3}%?,\\s?){3}(1|0?\\.\\d+)\\)|\\d{1,3}%?(,\\s?\\d{1,3}%?){2})"
    

    请注意,以这种方式使用反斜杠对于大多数从 C 派生的语言来说是很常见的,即使是松散地派生自 C。Swift 确实有一些 C 的祖先。

    在许多类 C 语言中,\n 是换行符,\t 是制表符,\f 是换页符,\" 是引号,\\ 是文字反斜杠。

    (我不认为 \f 换页符是在 Swift 中定义的。这让人回想起 ASCII 驱动的串行打印机的时代。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-23
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多