为什么Swift中的正则表达式没有编译?我怎么给它一个可变的字符串呢?

时间:2014-10-08 01:19:27

标签: ios regex swift nsregularexpression

当我使用以下代码从网址开头删除http://www.时,我收到错误。

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 个答案:

答案 0 :(得分:3)

您只需使用stringy构建NSMutableString即可NSMutableString(string: ...) nil。您还需要做一些其他事情来使代码工作:

  1. 您无法通过NSMatchingOptions.allZeros选项。如果您不想传递任何选项,则正确的值为init
  2. 在Xcode 6.1 GM中,您用于NSRegularExpression的{​​{1}}方法返回一个Optional(NSRegularExpression?),因此您需要使用可选链接来调用{{1} }}。 (在Xcode 6.0.1中可能不是这种情况;我不确定何时进行了更改)
  3. 由于regex?.replaceMatchesInString现在是stringy,因此您无法在其上调用NSMutableString。只需使用countElements()的长度属性即可。
  4. 有了这些更改后,代码如下所示:

    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: "")

      

    google.com

答案 1 :(得分:2)

让我知道这是否能让你到达目的地:

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/