     }
 }
 
+
+protocol _NSRangeBasedMatch : MatchProtocol {
+    
+    var nsRange: NSRange { get }
+}
+
+extension _NSRangeBasedMatch {
+    
+    public var range: Range<String.Index>? {
+        return nsRange.toRange(in: searched)
+    }
+    
+    public var matched: String {
+        guard let r = Range(self.nsRange) else { return "" }
+        let utf16Range = String.Index(encodedOffset: r.lowerBound) ..< String.Index(encodedOffset: r.upperBound)
+        return String(Substring(searched.utf16[utf16Range]))
+    }
+}
+
+
 // MARK: Match
 
 /// A type that represents a match searched by regular expression.
-public struct Match : MatchProtocol {
+public struct Match : _NSRangeBasedMatch {
     
     /// Options for matching
     public struct Options : OptionSetAdapting {

    
    /// The searching regex.
    public let regex: Regex
    
    /// The matched range.
    public var range: Range<String.Index>? {
        return result.range.toRange(in: searched)
    }
}

extension Match {

    
    
    /// A type thats represents capture group in a match.
    public struct CaptureGroup : _NSRangeBasedMatch {
    
        // The index in the match.
        public let index: Int
        
