2014-10-09 85 views
1

我有一個正在嘗試在Swift中使用的正則表達式以「rgba(255,255,255,1)」的形式解析出字符串的顏色值「Swift中的正則表達式在逃避反斜槓時不起作用

我的正則表達式的字符串是這樣的:

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

你可以看到它在這裏工作:

cl.ly/XxuH

當我逃避反斜槓並嘗試使用它與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 
+0

爲什麼問題被打上Objective-C的時候的問題是關於斯威夫特? - 一個小型自包含代碼示例將非常有幫助。 – 2014-10-09 21:02:33

+0

@MartinR因爲它使用NSRegularExpression而Swift和Obj-c中的正則表達式是一對一的。 – erickreutz 2014-10-09 21:03:51

+0

共同的因素是可可(Touch)框架; ObjC _language_與此無關。 – 2014-10-09 21:05:56

回答

2

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 
+0

我是個白癡!謝謝馬丁! – erickreutz 2014-10-09 21:25:34

相關問題