Tengo este regex funcionando cuando lo pruebo en PHP pero no funciona en Objective C:
(?:www\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\.?((?:[a-zA-Z0-9]{2,})?(?:\.[a-zA-Z0-9]{2,})?)
Traté de escapar de los personajes de escape, pero eso tampoco ayuda. ¿Debería escapar de cualquier otro personaje?
Este es mi código en Objective C:
NSMutableString *searchedString = [NSMutableString stringWithString:@"domain-name.tld.tld2"]; NSError* error = nil; NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?<!-))\\.?((?:[a-zA-Z0-9]{2,})?(?:\\.[a-zA-Z0-9]{2,})?)" options:0 error:&error]; NSArray* matches = [regex matchesInString:searchedString options:0 range:NSMakeRange(0, [searchedString length])]; for ( NSTextCheckingResult* match in matches ) { NSString* matchText = [searchedString substringWithRange:[match range]]; NSLog(@"match: %@", matchText); }
– ACTUALIZACIÓN –
Esta expresión regular devuelve (en PHP) la matriz con los valores “nombre de dominio” y “tld.tld2”, pero en Objective C solo obtengo un valor: “domain-name.tld.tld2”
– ACTUALIZACIÓN 2 –
Esta expresión regular extrae ‘nombre de dominio’ y ‘TLD’ de la cadena:
toma el nombre de dominio válido (no comienza o termina con ‘-‘ y entre 2 y 63 caracteres), y hasta dos partes de un TLD si las partes son válidas (al menos dos caracteres de largo contienen solo letras y números)
Espero que esta explicación ayude.
Un NSTextCheckingResult
tiene múltiples elementos obtenidos indexando en él.
[match rangeAtIndex:0];
es el partido completo.
[match rangeAtIndex:1];
(si existe) es la primera coincidencia de grupo de captura.
etc.
Puedes usar algo como esto:
NSString *searchedString = @"domain-name.tld.tld2"; NSRange searchedRange = NSMakeRange(0, [searchedString length]); NSString *pattern = @"(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?
Salida NSLog:
match: domain-name.tld.tld2
nombre de dominio
tld.tld2
Pruebe que los intervalos de coincidencia sean válidos.
Más simplemente en este caso:
NSString *searchedString = @"domain-name.tld.tld2"; NSRange searchedRange = NSMakeRange(0, [searchedString length]); NSString *pattern = @"(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?
Swift 3.0:
let searchedString = "domain-name.tld.tld2" let nsSearchedString = searchedString as NSString let searchedRange = NSMakeRange(0, searchedString.characters.count) let pattern = "(?:www\\.)?((?!-)[a-zA-Z0-9-]{2,63}(?
salida de impresión:
match: domain-name.tld.tld2
matchText1: nombre de dominio
matchText2: tld.tld2
Más simplemente en este caso:
do { let regex = try NSRegularExpression(pattern:pattern, options: []) let match = regex.firstMatch(in:searchedString, options:[], range:searchedRange) let matchText1 = nsSearchedString.substring(with: match!.rangeAt(1)) print("matchText1: \(matchText1)") let matchText2 = nsSearchedString.substring(with: match!.rangeAt(2)) print("matchText2: \(matchText2)") } catch let error as NSError { print(error.localizedDescription) }
salida de impresión:
matchText1: nombre de dominio
matchText2: tld.tld2
De acuerdo con la documentación de Apple , estos caracteres deben ser citados (usando \) para ser tratados como literales:
* ? + [ ( ) { } ^ $ | \ . /
También ayudaría si pudieras explicar lo que estás tratando de lograr. ¿Tienes algún accesorio de prueba?