Почему мое регулярное выражение в Swift не компилируется? Как мне дать ему изменяемую строку вместо этого?

Когда я использую следующий код, чтобы лишить http:// а также www. с начала URL, я получаю сообщение об ошибке.

var error: NSError? = nil
let regex = NSRegularExpression(pattern: "^(http(s)?://)?(www(\\d)?\\.)?", options: nil, error: &error)

var stringy = "http://www.google.com/"
regex.replaceMatchesInString(stringy, options: nil, range: NSMakeRange(0, countElements(stringy)), withTemplate: "")

Ошибка:

"NSString" не является подтипом "NSMutableString"

Как это исправить? Что я делаю неправильно?

2 ответа

Решение

Ты можешь сделать stringy NSMutableString просто создав его NSMutableString(string: ...), Вам также придется сделать несколько других вещей, чтобы ваш код работал:

  1. Вы не можете пройти nil для вариантов. Если вы не хотите передавать какие-либо параметры, правильное значение NSMatchingOptions.allZeros
  2. В Xcode 6.1 GM init метод, который вы используете для NSRegularExpression возвращает необязательный (NSRegularExpression?), поэтому вам нужно будет использовать необязательную цепочку для вызова regex?.replaceMatchesInString, (Это может быть не так в Xcode 6.0.1; я не уверен, когда это изменение было сделано)
  3. поскольку stringy является NSMutableString Теперь вы не можете позвонить countElements() в теме. Просто используйте NSStringвместо этого свойство длины.

С этими изменениями код выглядит следующим образом:

var error: NSError? = nil
let regex = NSRegularExpression(pattern: "^(http(s)?://)?(www(\\d)?\\.)?",
    options: nil, error: &error)

var stringy = NSMutableString(string: "http://www.google.com")
regex?.replaceMatchesInString(stringy, options: NSMatchingOptions.allZeros,
    range: NSMakeRange(0, stringy.length), withTemplate: "")

Потом звоню println(stringy) после того, как выполнены выводы:

google.com

Дайте мне знать, если это приведет вас туда, куда вы хотите:

let oldString = "http://www.google.com/"

let newString = oldString.stringByReplacingOccurrencesOfString("^(http(s)?://)?(www(\\d)?\\.)?", withString:"" as NSString, options:NSStringCompareOptions.RegularExpressionSearch, range:nil)
println(newString) //  google.com/
Другие вопросы по тегам