2015-08-02 2 views
3

Я пытаюсь использовать регулярное выражение для поиска по строке: "K1B92 (D) [56.094]", и я хочу захватить "(D)", включая круглые скобки вокруг "D". У меня возникли проблемы с поиском правильного выражения в соответствии с фактическими круглыми скобками, поскольку простое размещение круглых скобок примет его как блок и пытается избежать круглых скобок с "\", заставляя его думать, что это выражение будет оценено. Я также попытался убежать "\(" с "\\(" так: "\\([ABCD])\\)", но без везения. Это код, который я использовал:Swift - регулярное выражение для сопоставления круглых скобок

let str = "K1B92 (D) [56.094]" 

let regex = NSRegularExpression(pattern: "\\b\\([ABCD])\\)\\b", options: NSRegularExpressionOptions.CaseInsensitive, error: nil) 

let match = regex?.firstMatchInString(str, options: NSMatchingOptions.WithoutAnchoringBounds, range: NSMakeRange(0, count(str))) 

let strRange = match?.range 
let start = strRange?.location 
let length = strRange?.length 

let subStr = str.substringWithRange(Range<String.Index>(start: advance(str.startIndex, start!), end: advance(str.startIndex, start! + length!))) 

// "\\b\([ABCD])\)\\b" returns range only for the letter "D" without parentheses. 
// "\\b\\([ABCD])\\)\\b" returns nil 

Может направить меня к правильному выражению, пожалуйста? Большое спасибо.

ответ

5

\\([ABCD])\\) часть в порядке, Исправление: Как @vacawama правильно сказал в своем ответе, круглые скобки не совпадают здесь. \\([ABCD]\\) соответствует одной из букв A-D , заключенных в круглые скобки.

Другая проблема заключается в том, что нет границы слова (\b рисунка) между пробелом и скобкой.

Таким образом, вы можете либо (в зависимости от ваших потребностей), просто удалите \b узоры, или заменить их \s для белого пространства:

let regex = NSRegularExpression(pattern: "\\s\\([ABCD]\\)\\s", ... 

Но поскольку соответствует строка не должна включать в себя пространство нужно захват группы:

let regex = NSRegularExpression(pattern: "\\s(\\([ABCD]\\))\\s", ... 
// ... 
let strRange = match?.rangeAtIndex(1) 
+0

Я идентифицировал ее круглые скобки, это был оригинальный вопрос, но ваш ответ является наиболее полным. Я проголосовал за это и считаю, что это должен быть принятый ответ. (комментарий исправлен для использования правильного местоимения при обращении к OP) – vacawama

+0

Это решение отлично работает. Спасибо, Мартин Р и Вакавама за ответ, если так быстро. Очень ценится –

4

регулярное выражение вам нужно "\\([ABCD]\\)". Вам нужно удвоить побег \\ перед открытием пениса ( и закрыть paren ).

+0

Вы правы, и мое первоначальное замечание было неправильным. –

Смежные вопросы