Для приложения, над которым я работаю, мне нужно проверить, содержит ли текстовое поле только буквы A, T, C или G. Кроме того, я хотел бы сделать специализированную ошибку сообщений для любых других введенных символов. ex) «Не помещайте в пробелы». или «Буква b не является принятым значением». Я прочитал пару других сообщений, подобных этому, но они буквенно-цифровые, мне нужны только определенные символы.Проверка Objective-C String для конкретных символов
ответ
Один подход для вас, отнюдь не уникальна:
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
НТН
Посмотрите на ссылку класса NSRegularExpression.
Используйте 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]);
}
Также для параметра параметров вы должны посмотреть в документации, чтобы выбрать тот, который подходит.
Что именно это цикл делает? – MacBoss123541
Метод выше возвращает все совпадения в строке, поэтому вам нужно их закодировать и извлечь каждое соответствие отдельно. –
Также я заметил, что я не поставлял шаблон!Если вы хотите совместить A, T, C или G, используйте @ «A | T | C | G» в качестве шаблона. –
Как проверить диапазон символов? Как вы можете сказать, я все еще пытаюсь выучить всю эту цель-C, это очень много. – MacBoss123541
Снова много способов, но на самом простом уровне существует метод 'characterAtIndex:' на 'NSString' - диапазон дает вам начальный индекс и длину, поэтому простой цикл может поочередно проверять каждый символ. Существуют методы, которые дают вам диапазон как «NSString», и т. Д. Прочтите «NSString» и, возможно, страницы «NSMutableSet», doc. – CRD