regex Swift中的正则表达式在转义反斜杠时不起作用

lh80um4z  于 2023-03-31  发布在  Swift
关注(0)|答案(1)|浏览(120)

我有一个正则表达式,我试图在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
bvhaajcl

bvhaajcl1#

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

**更新:**使用Swift 5.7中引入的Regex类型,需要macOS 13+或iOS 16+):

let rgba = "rgba(255, 234, 243, 1)"

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*)?\)/

if let match = try? pattern.wholeMatch(in: rgba) {
    print(match.1)
    print(match.2)
    print(match.3)
    print(match.4)
}

相关问题