2013-10-13 5 views
2

Для приложения, над которым я работаю, мне нужно проверить, содержит ли текстовое поле только буквы A, T, C или G. Кроме того, я хотел бы сделать специализированную ошибку сообщений для любых других введенных символов. ex) «Не помещайте в пробелы». или «Буква b не является принятым значением». Я прочитал пару других сообщений, подобных этому, но они буквенно-цифровые, мне нужны только определенные символы.Проверка Objective-C String для конкретных символов

ответ

4

Один подход для вас, отнюдь не уникальна:

NString есть методы, чтобы найти подстроки, представленные в качестве NSRange расположения & смещения, составленные из символов в данной NSCharacterSet.

Множество того, что должно быть в строке:

NSCharacterSet *ATCG = [NSCharacterSet characterSetWithCharactersInString:@"ATCG"]; 

И множество того, что не должно:

NSCharacterSet *invalidChars = [ATCG invertedSet]; 

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

NSString *target; // the string you wish to check 
NSRange searchRange = NSMakeRange(0, target.length); // search the whole string 
NSRange foundRange = [target rangeOfCharacterFromSet:invalidChars 
              options:0 // look in docs for other possible values 
               range:searchRange]; 

Если нет недопустимых символов, то foundRange.location будет равен NSNotFound, в противном случае вы измените проверку диапазона символов в foundRange и создадите специализированные сообщения об ошибках.

Вы повторяете процесс, обновляя searchRange на основе foundRange, чтобы найти все пробежки недопустимых символов.

Вы можете скопировать найденные недопустимые символы в набор (возможно, NSMutableSet) и создать сообщения об ошибках в конце.

Вы также можете использовать регулярные выражения, см. NSRegularExpressions.

Etc. НТН

Добавление

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

NSString *target; // the string you wish to check 
NSUInteger length = target.length; // number of characters 
BOOL foundInvalidCharacter = NO; // set in the loop if there is an invalid char 

for(NSUInteger ix = 0; ix < length; ix++) 
{ 
    unichar nextChar = [target characterAtIndex:ix]; // get the next character 

    switch (nextChar) 
    { 
     case 'A': 
     case 'C': 
     case 'G': 
     case 'T': 
     // character is valid - skip 
     break; 

     default: 
     // character is invalid 
     // produce error message, the character 'nextChar' at index 'ix' is invalid 
     // record you've found an error 
     foundInvalidCharacter = YES; 
    } 
} 

// test foundInvalidCharacter and proceed based on it 

НТН

+0

Как проверить диапазон символов? Как вы можете сказать, я все еще пытаюсь выучить всю эту цель-C, это очень много. – MacBoss123541

+0

Снова много способов, но на самом простом уровне существует метод 'characterAtIndex:' на 'NSString' - диапазон дает вам начальный индекс и длину, поэтому простой цикл может поочередно проверять каждый символ. Существуют методы, которые дают вам диапазон как «NSString», и т. Д. Прочтите «NSString» и, возможно, страницы «NSMutableSet», doc. – CRD

2

Используйте NSRegulareExpression как это.

NSString *str = @"your input string"; 
NSRegularExpression *regEx = [NSRegularExpression regularExpressionWithPattern:@"A|T|C|G" options:0 error:nil]; 
NSArray *matches = [regEx matchesInString:str options:0 range:NSMakeRange(0, str.length)]; 
for (NSTextCheckingResult *result in matches) { 
    NSLog(@"%@", [str substringWithRange:result.range]); 
} 

Также для параметра параметров вы должны посмотреть в документации, чтобы выбрать тот, который подходит.

+0

Что именно это цикл делает? – MacBoss123541

+0

Метод выше возвращает все совпадения в строке, поэтому вам нужно их закодировать и извлечь каждое соответствие отдельно. –

+0

Также я заметил, что я не поставлял шаблон!Если вы хотите совместить A, T, C или G, используйте @ «A | T | C | G» в качестве шаблона. –