我试图将PHP函数转换为Swift。该函数用于根据我的正则表达式将String格式化为另一个。这就是我在PHP中所做的:
preg_match('/P(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)D)?T?(([0-9]+)H)?(([0-9]+)M)?(([0-9]+)(\.[0-9]+)?S)?/', $duration, $matches)
我使用$ matches数组来格式化我的新String。 所以,在Swift中,我找到了这个帖子:Swift extract regex matches,它似乎做了我想要的。但是当我得到结果时,我的数组只有一个字符串长,我的整个输入......
func matchesForRegexInText(regex: String!, text: String!) -> [String] {
let regex = NSRegularExpression(pattern: regex,
options: nil, error: nil)!
let nsString = text as NSString
let results = regex.matchesInString(text,
options: nil, range: NSMakeRange(0, nsString.length)) as [NSTextCheckingResult]
return map(results) { nsString.substringWithRange($0.range)}
}
let matches = matchesForRegexInText("P(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)D)?T?(([0-9]+)H)?(([0-9]+)M)?(([0-9]+)(.[0-9]+)?S)?", text: "PT00042H42M42S")
println(matches)
// [PT00042H42M42S]
你知道什么是错的吗?
感谢您的回答!
答案 0 :(得分:1)
数组包含一个元素,因为输入只包含一个字符串" PT00042H42M42S"与模式匹配。
如果您想要检索匹配的捕获组,那么您必须这样做
在rangeAtIndex:
上使用NSTextCheckingResult
。例如:
let pattern = "P(([0-9]+)Y)?(([0-9]+)M)?(([0-9]+)D)?T?(([0-9]+)H)?(([0-9]+)M)?(([0-9]+)(.[0-9]+)?S)?"
let regex = NSRegularExpression(pattern: pattern, options: nil, error: nil)!
let text = "PT00042H42M42S"
let nsString = text as NSString
if let result = regex.firstMatchInString(text, options: nil, range: NSMakeRange(0, nsString.length)) {
for i in 0 ..< result.numberOfRanges {
let range = result.rangeAtIndex(i)
if range.location != NSNotFound {
let substring = nsString.substringWithRange(result.rangeAtIndex(i))
println("\(i): \(substring)")
}
}
}
结果:
0: PT00042H42M42S 7: 00042H 8: 00042 9: 42M 10: 42 11: 42S 12: 42