2015-10-25 2 views
-1

У меня есть xml-файл с регулярным выражением. Когда я его прочитал, я получаю выражение <a class="call-to-action-details".*?\shref="(.*?)" в переменной под названием regex.Escape regular expression

Затем я вызываю свой метод string: print(text.searchRegex(regex)), и он ничего не возвращает.

Но если я называю свой метод регулярных выражений и избежать некоторых символов, то он возвращает результаты:

print(text.searchRegex("<a class=\"call-to-action-details\".*?\\shref=\"(.*?)\"")) 

Как ускользают символы? Или что я сделал неправильно? Моя regexSearch функция:

do { 
    let regex = try NSRegularExpression(pattern: regex, 
     options: NSRegularExpressionOptions(rawValue: 0)) 
    let nstext = text as NSString 
    let all = NSRange(location: 0, length: nstext.length) 
    var matches: Array<String> = Array<String>() 
    regex.enumerateMatchesInString(text, 
      options: NSMatchingOptions(rawValue: 0), 
      range: all) { 
     (result : NSTextCheckingResult?, _, _) in 
     let theResult = nstext.substringWithRange(result!.rangeAtIndex(1)) 
     matches.append(theResult) 
    } 
    print(matches) 
    return matches.joinWithSeparator("") 
} catch { 
    return "" 
} 
+0

Вы пытались вызвать 'escapedPatternForString:'? – matt

ответ

0

В строковый литерал, обратный слеш (\) и двойные кавычки (") должны быть экранированы с помощью обратной косой черты.

Возможно, это также плохая идея использовать одно и то же имя regex для вашей строки шаблона в качестве итогового NSRegularExpression.

При чтении регулярного выражения из файла вам не нужно избегать символов, как в литерале. Выражение

<a class="call-to-action-details".*?\shref="(.*?)" 

может быть использован непосредственно NSRegularExpression при чтении из файла.

Если вы не получаете совпадение с регулярным выражением в файле, попробуйте проверить равенство вашего рабочего литерала регулярного выражения и строку, в которой вы читаете. Может быть, дополнительный символ где-то, что заставляет их не совпадать.

Кроме этого, ваш код будет захватывать матч без проблем.