2014-10-09 1 views
1

У меня есть регулярное выражение, которое я пытаюсь использовать в Swift для анализа значений цвета строки в форме «rgba (255, 255, 255, 1)»Regex in 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, когда речь идет о Swift? - Небольшой самодостаточный пример кода был бы чрезвычайно полезен. –

+0

@MartinR потому что он использует NSRegularExpression и регулярные выражения в Swift vs. Obj-c - один к одному. – erickreutz

+0

Общим фактором является структура Cocoa (Touch); ObjC _language_ не имеет к этому никакого отношения. –

ответ

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