正则表达式匹配Swift中的String问题

时间:2014-06-18 19:32:13

标签: regex swift core-text

我正在将基于CoreText的应用程序转换为Swift,并且在将匹配项添加到文本中的正则表达式时遇到了问题。

这是示例代码

let regexOptions = NSRegularExpressionOptions.CaseInsensitive | NSRegularExpressionOptions.DotMatchesLineSeparators
let regex = NSRegularExpression.regularExpressionWithPattern("(.*?)(<[^>]+>|\\Z)", options: regexOptions, error: nil)
var results: Array<NSTextCheckingResult> = regex.matchesInString(text, options: 0, range: NSMakeRange(0, countElements(text)))

根据文档,matchesInString函数返回一个NSTextCheckingResults数组,但编译器抱怨声明“类型anyObject []的表达式无法转换为”{{1}对这里可能有什么不妥的想法?

2 个答案:

答案 0 :(得分:7)

尝试像这样分配results变量:

var results = regex.matchesInString(text, options: nil, range: NSMakeRange(0, countElements(text))) as Array<NSTextCheckingResult>

  1. 返回类型为Array<AnyObject>[]!,您可以在此处投放(如上例所示)或稍后检查集合成员时

  2. 在Swift选项中,nil代表一个空的选项集(与Objective-C中的0对比)

答案 1 :(得分:0)

我只是遇到了与某些正则表达式相关的问题,并且认为我会在上面提交的答案中添加警告。我的正则表达式匹配似乎被缩短了,结果证明我提供的范围不正确。我以@fqdn描述的方式生成了范围。事实证明,我的字符串包含回车符(\ u {A}),并且countElements函数不计算这些回车符。 我通过在字符串上调用.unicodeScalars来反击这一点,这似乎纠正了长度。

println(countElements("\u{A}\u{A}\u{A}\n\u{D}\n\u{D}\n\u{D}\n\u{D}\n")) //8
println(countElements("\u{A}\u{A}\u{A}\n\u{D}\n\u{D}\n\u{D}\n\u{D}\n".unicodeScalars))  //12

免责声明:这很可能是一个快速错误,可能会在以后的版本中修复。