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)
}
}