¿Cómo ver si un NSString comienza con cierta otra cadena?


152

Estoy tratando de verificar si una cadena que voy a usar como URL comienza con http. La forma en que estoy tratando de verificar en este momento no parece estar funcionando. Aquí está mi código:

NSMutableString *temp = [[NSMutableString alloc] initWithString:@"http://"];
if ([businessWebsite rangeOfString:@"http"].location == NSNotFound){
    NSString *temp2 = [[NSString alloc] init];
    temp2 = businessWebsite;
    [temp appendString:temp2];
    businessWebsite = temp2;
    NSLog(@"Updated BusinessWebsite is: %@", businessWebsite);
}

[web setBusinessWebsiteUrl:businessWebsite];

¿Algunas ideas?

Respuestas:


331

Prueba esto: if ([myString hasPrefix:@"http"]).

Por cierto, su prueba debe ser en != NSNotFoundlugar de == NSNotFound. Pero supongamos que su URL es ftp://my_http_host.com/thing, coincidirá pero no debería.


Sí, eso fue todo. Debería haber notado la cosa! = Antes, pero al final fue el hasPrefix lo que funcionó. Gracias por el consejo, marcaré la suya como la respuesta correcta tan pronto como me lo permita.
— Rob

23

Me gusta usar este método:

if ([[temp substringToIndex:4] isEqualToString:@"http"]) {
  //starts with http
}

o incluso más fácil:

if ([temp hasPrefix:@"http"]) {
    //do your stuff
}

1
Eso también es bueno. De esta manera también es un poco más flexible, gracias por el comentario
— Rob

2
Esto se bloqueará si la cadena temporal tiene menos de 5 caracteres. El índice comienza en 0. Entonces, esta no es una buena respuesta. Además, el ejemplo tiene una falta de coincidencia de recuento de caracteres: "http" no tiene 5 caracteres. La insensibilidad a los casos también debe ser considerada.
— Daniel

@Daniel ¿Qué estás diciendo? ¿Por qué 5? Esto no es un NSArray ... ¡El índice 4 es el 4to carácter, no el 5to! ¿Y alguna vez has visto Http o hTtP? Las mayúsculas y minúsculas no son relevantes. Además, la pregunta era sobre verificar si la cadena comienza con http, no sobre si la cadena tiene menos de 4 caracteres. hasPrefix: es mejor pero funciona igual de bien. Deja de
— quejarte

3
@JonasG: Sí, tiene razón sobre el comportamiento de substringToIndex. Sin embargo, tenga en cuenta que el índice 4 es en realidad el quinto carácter; El índice 0 es el primer carácter. Asumí por error que substringToIndex incluye el carácter especificado por el índice, pero no lo hace. La distinción entre mayúsculas y minúsculas es relevante cuando la participación del usuario está involucrada, lo que creo que la pregunta sugiere. Considere el caso de " HTTP: // WWW ...". Pero el mayor problema es que la solución propuesta arrojará una excepción cuando encuentre "ftp" o una cadena de menos de 4 caracteres. El método hasPrefix no tiene el mismo problema.
— Daniel

6

Si está buscando "http:" probablemente querrá una búsqueda sin distinción entre mayúsculas y minúsculas:

NSRange prefixRange = 
    [temp rangeOfString:@"http" 
                options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
if (prefixRange.location == NSNotFound)

2

Versión rápida:

if line.hasPrefix("#") {
  // checks to see if a string (line) begins with the character "#"
}

No sé por qué esto fue rechazado ... esta es la forma simple y rápida de hacer esto. La mayoría de los nuevos desarrolladores de iOS probablemente usarán Swift de ahora en adelante, y el OP nunca dijo que solo se solicitaran respuestas Objective-C.
— Richard

"No sé por qué esto fue rechazado", ¿probablemente porque la sintaxis es incorrecta? Debería ser if line.hasPrefix("prefix"){} `
— superarts.org

1
Gracias por señalar una sintaxis más simple, pero colocar () alrededor de una declaración if no es una sintaxis incorrecta. Para algunos de los veteranos, se lee más claramente y funciona exactamente igual. if (line.hasPrefix("#")) {}funciona igual de bien
— Richard

-1

Esta es mi solución al problema. Eliminará las letras que no son necesarias y no distingue entre mayúsculas y minúsculas.

    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return [self generateSectionTitles];
}

-(NSArray *)generateSectionTitles {

    NSArray *alphaArray = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"U", @"V", @"W", @"X", @"Y", @"Z", nil];

    NSMutableArray *sectionArray = [[NSMutableArray alloc] init];

    for (NSString *character in alphaArray) {



        if ([self stringPrefix:character isInArray:self.depNameRows]) {
            [sectionArray addObject:character];
        }

    }

    return sectionArray;

}

-(BOOL)stringPrefix:(NSString *)prefix isInArray:(NSArray *)array {

    for (NSString *str in array) {

        //I needed a case insensitive search so [str hasPrefix:prefix]; would not have worked for me.
        NSRange prefixRange = [str rangeOfString:prefix options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
        if (prefixRange.location != NSNotFound) {
            return TRUE;
        }

    }

    return FALSE;

}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {

    NSInteger newRow = [self indexForFirstChar:title inArray:self.depNameRows];
    NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:newRow inSection:0];
    [tableView scrollToRowAtIndexPath:newIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];

    return index;
}

// Return the index for the location of the first item in an array that begins with a certain character
- (NSInteger)indexForFirstChar:(NSString *)character inArray:(NSArray *)array
{
    NSUInteger count = 0;
    for (NSString *str in array) {

        //I needed a case insensitive search so [str hasPrefix:prefix]; would not have worked for me.
        NSRange prefixRange = [str rangeOfString:character options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
        if (prefixRange.location != NSNotFound) {
            return count;
        }
        count++;
    }
    return 0;
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.