2017-01-14 2 views
0

Я пытаюсь сделать простое Regex в Swift 3, извлекая номер из входной строки.Swift 3 extract group из Regex - NS-мостовой беспорядок

Поскольку я не знаком с iOS, это оказалось довольно сложной задачей. Я очень подозреваю, что моя ошибка заключается в использовании одновременно String и NSString.

let url = "a5b" 
let nsUrl = url as NSString 

let regex = try! NSRegularExpression(pattern: "a(\\d)b", options: []) 
let matches = regex.matches(in: url, options: [], range: NSRange(location: 0, length: url.characters.count)) 

somestuff(str: nsUrl.substring(with: matches[1].range)) 

завершается за исключением следующего:

Нагрузочным приложение из-за неперехваченное исключение 'NSRangeException', причина: «*** - [__ NSSingleObjectArrayI objectAtIndex]: индекс 1 за пределы [0 .. 0] '

Каков правильный способ согласования и получения номера?

+2

Это не может быть критическим в вашем примере данных, но 'url.characters.count' должен быть изменен на' url.utf16.count'. 'NSRegularExpression' использует местоположение и длину на основе UTF-16. – OOPer

ответ

2

Индексы с нуля, но захваченный группа имеет индекс 1

somestuff(str: nsUrl.substring(with: matches[0].rangeAt(1))) 

Вы должны проверить не спички в любом случае ...


диапазон О возвращаемого значения matches(in:

Массив из NSTextCheckingResult объектов. Каждый результат дает общий согласованный диапазон через его свойство range и диапазон каждой отдельной группы захвата с помощью метода rangeAt(_:). Диапазон {NSNotFound, 0} возвращается, если одна из групп захвата не участвовала в этом конкретном матче.

Примечание: range фактически такой же, как rangeAt(0)

+0

[0] дает мне a5b (весь ввод), то же, что и в Java. – Zackline

+0

Получил, я обновил ответ. – vadian

+0

Спасибо, это работает, примет как можно скорее. Не могли бы вы вдаваться в подробности, почему это необходимо? Я не очень понимаю API. Он дает вам массив совпадений, логически можно было бы найти группу захвата в матчах [1]. Почему «rangeAt», который «возвращает тип результата, который представляет диапазон», дает вам диапазон группы захвата, что выходит за рамки моего понимания. – Zackline