una pantalla hacer cómo como captura boton ios regex swift compiler-errors enumerate

ios - como - cómo hacer una captura de pantalla en iphone 5



¿Por qué tener más de un grupo de captura en mi regex bloquea mi aplicación? (1)

Independientemente de lo que sea la expresión regular,> 1 grupo de captura bloqueará este código con el siguiente error.

Aplicación de finalización debido a una excepción no detectada ''NSRangeException'', razón: ''- [__ NSCFString substringWithRange:]: Intervalo {9223372036854775807, 0} fuera de límites; longitud de cuerda 279 ''

public extension String { //Multi use parsing function func regexParse(pattern:String, captureGroup:Int, caseSensitive:Bool) ->[String] { do { //Creates empty results array. var resultsArray = [""] //Sets Case sensitivity var caseSensitivity = NSRegularExpressionOptions.CaseInsensitive if(caseSensitive) { caseSensitivity = NSRegularExpressionOptions.init(rawValue: 0) } //Sets regex to correct pattern let regex = try NSRegularExpression(pattern: pattern, options: caseSensitivity) //Converts string to NSString as swift doesn''t support regex let nsString = self as NSString //Sets parsing range to the entire string let all = NSMakeRange(0, nsString.length) //Enumerates through all matches and extracts the 1st capture bracket for each match and adds it to the resultsArray. regex.enumerateMatchesInString(self, options: NSMatchingOptions(rawValue: 0), range: all) { (result: NSTextCheckingResult?, _, _) in let theResult = nsString.substringWithRange(result!.rangeAtIndex(captureGroup)) resultsArray.append(theResult) } //!!>>>>>>>>Error occurs here after skipping MatchingOptions content.!! return resultsArray } catch { print("Invalid regex") return(["Error"]) } }

}


Range {9223372036854775807, 0} es {NSNotFound, 0} , eso significa que no hay coincidencia.

De la documentación

Algunas expresiones regulares (aunque no el patrón de ejemplo) pueden coincidir con éxito con un rango de longitud cero, por lo que la comparación del rango resultante con {NSNotFound, 0} es la forma más confiable de determinar si hubo una coincidencia o no.

Implementar un cheque en enumerateMatchesInString por ejemplo

regex.enumerateMatchesInString(self, options: [], range: all) { (result: NSTextCheckingResult?, _, _) in let capturedRange = result!.rangeAtIndex(captureGroup) if !NSEqualRanges(capturedRange, NSMakeRange(NSNotFound, 0)) { let theResult = nsString.substringWithRange(capturedRange) resultsArray.append(theResult) } }