У меня есть NSString (номер телефона) с некоторыми скобками и дефисами, так как некоторые номера телефонов отформатированы. Как бы я удалил все символы, кроме чисел, из строки?
objective-c
nsstring
Бен Харрис
источник
источник
NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"charactersGoHere"]
NSString *pureNumbers = [pureNumbers stringByTrimmingCharactersInSet: [NSCharacterSet decimalDigitCharacterSet] invertedSet]
не работает?[NSCharacterSet decimalDigitCharacterSet]
другой, который содержит только цифры и буквы. Вы можете создать один, создаваяNSMutableCharaterSet
и передаваяdecimalDigitCharacterSet
,uppercaseLetterCharacterSet
иlowercaseLetterCharacterSet
кformUnionWithCharacterSet:
. Обратите внимание, что такжеletterCharacterSet
включает в себя метки, следовательно, использование строчных и прописных версий.Нет необходимости использовать библиотеку регулярных выражений, как подсказывают другие ответы - вызывается класс, который вам нужен
NSScanner
. Используется следующим образом:РЕДАКТИРОВАТЬ: Я обновил код, потому что оригинал был написан на моей голове, и я подумал, что этого будет достаточно, чтобы направить людей в правильном направлении. Кажется, что люди после кода, они могут просто скопировать и вставить прямо в свое приложение.
Я также согласен с тем, что решение Майкла Пельца-Шермана более уместно, чем использование
NSScanner
, так что вы можете взглянуть на это.источник
Принятый ответ является излишним для того, что просят. Это намного проще:
источник
Это здорово, но код не работает для меня на iPhone 3.0 SDK.
Если я определю strippedString, как вы показываете здесь, я получаю
BAD ACCESS error
при попытке распечатать его послеscanCharactersFromSet:intoString
вызова.Если я сделаю это так:
Я получаю пустую строку, но код не падает.
Вместо этого мне пришлось прибегнуть к старому доброму C:
источник
Хотя это старый вопрос с рабочими ответами, я пропустил поддержку международного формата . Основанный на решении simonobo, измененный набор символов включает в себя знак плюс "+". Международные телефонные номера также поддерживаются этой поправкой.
Свифт выражений
Что приводит к +12345671000 в качестве общего формата международного телефонного номера.
источник
Вот Swift-версия этого.
источник
Свифт версия самого популярного ответа:
Изменить: Синтаксис для Swift 2
Изменить: Синтаксис для Swift 3
источник
Спасибо за пример. У него есть только одна вещь, пропускающая приращение scanLocation в случае, если один из символов в originalString не найден внутри объекта NumberSet. Я добавил оператор else {}, чтобы исправить это.
источник
Принимаем только номер мобильного телефона
источник
Возможно, стоит отметить, что принятый
componentsSeparatedByCharactersInSet:
иcomponentsJoinedByString:
основанный на ответе не является эффективным с точки зрения памяти решением. Он выделяет память для набора символов, для массива и для новой строки. Даже если это только временные выделения, обработка большого количества строк таким способом может быстро заполнить память.Подход, ориентированный на память, заключается в работе с изменяемой копией строки на месте. В категории над NSString:
Профилирование двух подходов показало это, используя примерно на 2/3 меньше памяти.
источник
Вы можете использовать регулярное выражение для изменяемой строки:
источник
Создано топовое решение как категория, чтобы помочь с более широкими проблемами:
Интерфейс:
реализации внешних:
Использование:
источник
Свифт 3
источник
Свифт 4.1
источник
Um. Первый ответ кажется мне совершенно неверным. NSScanner действительно предназначен для разбора. В отличие от регулярных выражений, вы разбираете строку по одному крошечному фрагменту за раз. Вы инициализируете его строкой, и он поддерживает индекс того, как далеко вдоль строки он получен; Этот показатель всегда его точка отсчета, и все команды, которые вы даете его по сравнению с этой точкой. Вы говорите: «Хорошо, дайте мне следующий кусок символов в этом наборе» или «Дайте мне целое число, которое вы найдете в строке», и они начинаются с текущего индекса и продвигаются, пока не найдут то, что не соответствие. Если самый первый символ уже не совпадает, то метод возвращает NO, и индекс не увеличивается.
Код в первом примере сканирует "(123) 456-7890" на наличие десятичных символов, что уже не выполняется с самого первого символа, поэтому при вызове scanCharactersFromSet: intoString: оставляется переданная strippedString в одиночку и возвращается NO; Код полностью игнорирует проверку возвращаемого значения, оставляя strippedString неназначенным. Даже если бы первый символ был цифрой, этот код потерпел бы неудачу, так как он возвращал бы только те цифры, которые он обнаружил, до первой черты или скобки или чего-то еще.
Если вы действительно хотите использовать NSScanner, вы можете поместить что-то подобное в цикл и продолжать проверять возвращаемое значение NO, а если вы его получите, вы можете увеличивать scanLocation и сканировать снова; и вы также должны проверить isAtEnd и yada yada yada. Короче говоря, неправильный инструмент для работы. Решение Майкла лучше.
источник
Для тех, кто ищет извлечение телефона, вы можете извлечь телефонные номера из текста, используя NSDataDetector, например:
`
источник
Я создал категорию на NSString, чтобы упростить эту обычную операцию.
NSString + AllowCharactersInSet.h
NSString + AllowCharactersInSet.m
источник
Я думаю, что в настоящее время лучший способ это:
источник
Если вы просто хотите получить числа из строки, вы можете использовать регулярные выражения для их анализа. Для выполнения регулярных выражений в Objective-C, проверьте RegexKit .Редактировать: как указывает @Nathan, использование NSScanner - это гораздо более простой способ анализа всех чисел из строки. Я совершенно не знал об этом варианте, так что подпишите его за предложение. (Я даже не люблю использовать регулярные выражения, поэтому я предпочитаю подходы, которые не требуют их.)Если вы хотите отформатировать телефонные номера для отображения, стоит взглянуть на NSNumberFormatter . Я предлагаю вам прочитать этот связанный вопрос SO для советов по этому вопросу. Помните, что номера телефонов отформатированы по-разному в зависимости от местоположения и / или локали.
источник
Swift 5
источник
Основываясь на ответе Джона Фогеля, он представляет собой расширение Swift String вместе с некоторыми базовыми тестами.
И некоторые тесты, доказывающие хотя бы базовую функциональность:
Это отвечает на вопрос ОП, но его можно легко изменить, чтобы оставить в телефонном номере связанные символы, такие как ",; * # +"
источник
];
Будь проще!
источник