2016-05-09 2 views
0

У меня есть строка, которая:Как записать слова вокруг шаблона регулярных выражений?

let s : String = "The dog ate the cat." 

со следующей схемой:

let p : NSRegularExpression = try! NSRegularExpression(pattern: "\\w()?dog()?\\w"), options: .CaseInsensitive) 

Мой вопрос: Как я могу получить слова до и после появления паттерна?

Это моя текущая реализация:

let t : [NSTextCheckingResults] = p.matchesInString(s, options: [], NSMakeRange(0, NSString(string: s).length)) 
print(String(t[0].URL!)) 

Однако это не возвращает желаемый результат.

Что не так с моим регулярным выражением?

+0

Вашего шаблон ток становится 'е собаки a' это то, что вы на самом деле хочешь? См. Здесь: https://regex101.com/r/zM6aF2/1 –

+0

Нет, это не так. Хотя это больше информации, чем раньше. Все Xcode показывает, когда я печатаю: «\\ w()? Dog()? \\ w" –

+0

Ну, я не разработчик ios. Я делился своими знаниями только с регулярным выражением. Не знаю, требует ли objC scaping или нет. Хотя в регулярном выражении шаблон, который вам нужен, чтобы получить то, что вы задаете в своем вопросе, будет '(. +) \ Bdog \ b (. +)', После чего вы получите группы захвата из него. См. Это регулярное выражение, работающее здесь: https://regex101.com/r/zM6aF2/2 –

ответ

1

Попробуйте это:

extension String { 
    subscript (range: NSRange) -> String { 
     let startIndex = self.startIndex.advancedBy(range.location) 
     let endIndex = startIndex.advancedBy(range.length) 

     return self[startIndex..<endIndex] 
    } 
} 

let s = "The dog ate the cat." 

let pattern = try! NSRegularExpression(pattern: "(\\w+)?\\s?dog\\s?(\\w+)?", options: [.CaseInsensitive]) 

let matches = pattern.matchesInString(s, options: [], range: NSMakeRange(0, s.characters.count)) 

for m in matches { 
    print(s[m.rangeAtIndex(0)]) 

    let range1 = m.rangeAtIndex(1) 
    if range1.location != NSNotFound { 
     print("capture group 1:", s[range1]) 
    } 

    let range2 = m.rangeAtIndex(2) 
    if range2.location != NSNotFound { 
     print("capture group 2:", s[range2]) 
    } 
} 

Расширение для String не является обязательным, но позволяет работать с NSRange гораздо проще. В 2 захвате группа были сделана необязательной с (\\w+)?, чтобы она соответствовала следующим строкам тоже:

// The dog ate the cat 
The dog ate 
capture group 1: the 
capture group 2: ate 

// dog ate my home work 
dog ate 
capture group 2: ate 

// I love my dog 
my dog 
capture group 1: my 

// dog 
dog 
+0

Регулярное выражение работает (huzzah!) Хотя кажется, что NSTextCheckingResult не имеет свойства URL. Любые идеи относительно того, почему это так? –

+0

Оформить заказ ['NSDataDetector'] (https://developer.apple.com/library/mac/documentation/Foundation/Reference/NSDataDetector_Class/#//apple_ref/occ/instp/NSDataDetector/checkingTypes), подкласс' NSRegularExpression' , 'NSDataDetector' - это, по сути, регулярные выражения, предоставляемые Apple, которые помогают вам обнаруживать некоторые общие данные (URL-адреса, адрес, даты календаря и т. Д.). Во всяком случае, нет URL-адреса для захвата в ваших образцовых строках. –

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