2013-06-16 7 views
-3

Я довольно новичок в манипуляциях с NSString и не имею большого опыта во всех манипуляциях с строками на любом языке.Извлечение имени из строки

Моя проблема заключается в том, что у меня есть строка, содержащая много данных, внутри этих данных это имя, которое мне нужно извлечь в новую NSString. EG:

NSString* dataString [email protected]"randomdata12359123888585/name_john_randomdatawadapoawdk" 

«/ name_» всегда предшествует данным, которые мне нужны, и «_» всегда следует за ним.

Я изучил такие вещи, как NSScanner, но я не совсем уверен, что такое правильный подход или как реализовать NSScanner.

+1

Итак, вы использовали NSScanner. где код этого подхода? – vikingosegundo

+0

Итак, два слова, разделенные символом подчеркивания после имени, - это то, что вы хотите извлечь? – Anupdas

+1

Итак, вы просто хотите бросить все на помощь, не сказав, где у вас есть трудности? Существует так много тем о разделении строки на более мелкие. Вы запустили поиск? –

ответ

1

Мне удалось сделать это с помощью NSScanner, однако ответ массива тоже будет работать, поэтому я его поддержал.

Код NSScanner Я использовал для тех, кто еще сталкивается с подобной проблемой является:

-(void)formatName{ 
NSString *stringToSearch = _URLString; //url string is the long string we wish to search. 

NSScanner *scanner = [NSScanner scannerWithString:stringToSearch]; 
[scanner scanUpToString:@"name_" intoString:nil]; // Scan all characters before name_ 
while(![scanner isAtEnd]) { 
    NSString *substring = nil; 
    [scanner scanString:@"name_" intoString:nil]; // Scan the # character 
    if([scanner scanUpToString:@"_" intoString:&substring]) { 
     // If the space immediately followed the _, this will be skipped 

     _nameIwant = substring; //nameIwant is a property to store the name I scanned for 
     return; 
    } 

} 

}

1
-(void)separateString{ 
NSString* dataString [email protected]"randomdata12359123888585/name_john_randomdatawadapoawdk"; 
NSArray *arr1 = [dataString componentsSeparatedByString:@"/"]; 
NSArray *arr2 = [[arr1 objectAtIndex:1] componentsSeparatedByString:@"_"]; 
NSLog(@"%@ %@",arr1,arr2); 
} 

Выход вы получаете

arr1= (
randomdata12359123888585, 
"name_john_randomdatawadapoawdk" 
) 
arr2 = (
name, 
john, 
randomdatawadapoawdk 
) 

теперь вы можете получить доступ к имени или независимо от индекса массива.

3

Ваш формат строки очень хорошо определяется (как вы говорите, имя вы после всегда, которому предшествуют «/ name_» и всегда, за которым следует «_»), и я полагаю, что имя («john»), следовательно, не может содержать символ подчеркивания.

поэтому я бы рассмотреть простое регулярное выражение, которое идеально подходит для такого рода проблемы:

NSString *regexPattern = @"^.*/name_(.*?)_.*$"; 

NSString *name = [dataString stringByReplacingOccurrencesOfString: regexPattern 
                 withString: @"$1" 
                  options: NSRegularExpressionSearch 
                  range: NSMakeRange(0, dataString.length)]; 

В случае, если вы не знакомы с регулярными выражениями, что здесь происходит:

  1. начало в начале строки (далее "^")
  2. Разрешить ничего ("*"), а затем "/ name_"
  3. Capture то, что следующим образом (вводное слово s означает «захватить это»)
  4. В скобках разрешите что угодно («. *»), но сделайте его как можно короче («?» после «*»)
  5. За ним следует подчеркивание, а затем разрешить все, что может быть до конца строки («$»)

Это будет соответствовать всей строке и при подстановке соответствия (т. е. всей строки) с «$ 1», он заменит совпадение подстрокой, включенной в первую (и только) круглую скобку.

Результат: он выдает строку, содержащую только имя. Если строка не имеет правильного формата (т. Е. Нет имени между двумя символами подчеркивания), то это ничего не изменит и вернет полную, оригинальную строку.

Это вопрос стиля кодирования, предпочитаете ли вы один подход друг другу, но если вам нравятся регулярные выражения, то этот подход является чистым, понятным и простым в обслуживании.

Как я вижу, любая хрупкость в этом обусловлена ​​форматом данных, который выглядит подозрительно, как что-то, что зависит от других «случайных» фрагментов данных, поэтому, какой бы метод вы ни выбрали для разбора этой строки, убедитесь, что вы добавили некоторые защитные тесты, чтобы проверить формат данных и предупредить вас, если неожиданные строки начнут вводить ваши данные. Это может быть через несколько лет, когда вы забыли все о символах подчеркивания, регулярных выражений и NSScanner.