【问题标题】:Regex in Swift not working when escaping backslashes转义反斜杠时,Swift 中的正则表达式不起作用
【发布时间】:2014-12-04 22:30:24
【问题描述】:

我有一个正则表达式,我试图在 Swift 中使用它来解析字符串的颜色值,格式为“rgba(255, 255, 255, 1)”

我的正则表达式字符串是这样的:

^rgba?\(\s*(\d{1,3}(?:\.\d+)?\%?)\s*,\s*(\d{1,3}(?:\.\d+)?\%?)\s*,\s*(\d{1,3}(?:\.\d+)?\%?)\s*(?:\s*,\s*(\d+(?:\.\d+)?)\s*)?\)$

你可以在这里看到它的工作原理:

当我转义反斜杠并尝试将其与NSRegularExpression 一起使用时,它不再匹配给定的字符串。

^rgba?\\(\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*(?:\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)$

是不是我做错了什么?

代码示例:

import Foundation

var pattern = "^rgba?\\(\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*(?:\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)$"

var string = "rgba(255, 234, 243, 1)"

var regex = NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions(0), error: nil)

regex.numberOfMatchesInString(string, options: nil, range: NSMakeRange(0, countElements(string))) // Yields 1. Should yield 4

【问题讨论】:

  • 当问题是关于 Swift 的时候,为什么问题会被标记为 Objective-C? – 一个小的独立代码示例将非常有帮助。
  • @MartinR 因为它使用 NSRegularExpression 并且 Swift 与 Obj-c 中的正则表达式是一对一的。
  • 共同因素是Cocoa(Touch)框架; ObjC 语言与此无关。
  • @MartinR 代码示例添加

标签: regex string cocoa swift nsregularexpression


【解决方案1】:

numberOfMatchesInString 返回 1,因为整个模式匹配一​​次。 使用rangeAtIndex()获取捕获组匹配的范围:

let pattern = "^rgba?\\(\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*,\\s*(\\d{1,3}(?:\\.\\d+)?\\%?)\\s*(?:\\s*,\\s*(\\d+(?:\\.\\d+)?)\\s*)?\\)$"
let regex = NSRegularExpression(pattern: pattern, options: nil, error: nil)

let rgba : NSString = "rgba(255, 234, 243, 1)"
if let match = regex!.firstMatchInString(rgba, options: nil, range: NSMakeRange(0, rgba.length)) {
    println(rgba.substringWithRange(match.rangeAtIndex(1)))
    println(rgba.substringWithRange(match.rangeAtIndex(2)))
    println(rgba.substringWithRange(match.rangeAtIndex(3)))
    println(rgba.substringWithRange(match.rangeAtIndex(4)))
}

输出:

255
234
243
1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-07
    • 2011-04-30
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2011-08-29
    相关资源
    最近更新 更多