は、私は、このような解決策を示唆している:脇
import Foundation
extension String {
func rangesOfString(s: String) -> [Range<Index>] {
let re = try! NSRegularExpression(pattern: NSRegularExpression.escapedPatternForString(s), options: [])
return re.matchesInString(self, options: [], range: nsRange(startIndex ..< endIndex)).flatMap { range($0.range) }
}
func range(nsRange : NSRange) -> Range<Index>? {
let utf16from = utf16.startIndex.advancedBy(nsRange.location, limit: utf16.endIndex)
let utf16to = utf16from.advancedBy(nsRange.length, limit: utf16.endIndex)
if let from = String.Index(utf16from, within: self),
let to = String.Index(utf16to, within: self)
{
return from ..< to
} else {
return nil
}
}
func nsRange(range : Range<Index>) -> NSRange {
let utf16from = String.UTF16View.Index(range.startIndex, within: utf16)
let utf16to = String.UTF16View.Index(range.endIndex, within: utf16)
return NSRange(location: utf16.startIndex.distanceTo(utf16from), length: utf16from.distanceTo(utf16to))
}
}
print("[^x]? [^x]? [^x]?".rangesOfString("[^x]?")) // [Range(0..<5), Range(6..<11), Range(12..<17)]
主な問題は、このコードはまた、道を示してい変換する NSRange
からRange<String.Index>
(this postに基づく)。
とそれが間違っていることを説明してください – Wain
あなたが望む結果を詳細に説明してください? – PSS
'.'は「任意の文字」を意味する特殊文字です – redent84