Как проверить, содержит ли строка другую строку в Swift?

469

В Objective-C код для проверки подстроки в NSString:

NSString *string = @"hello Swift";
NSRange textRange =[string rangeOfString:@"Swift"];
if(textRange.location != NSNotFound)
{
    NSLog(@"exists");
}

Но как это сделать в Swift?

  • 1
    @rckoenes Я новичок в Swift, я знаю, как это сделатьC
  • 1
    Тогда почему бы вам не начать игровую площадку и не попробовать ее?
Показать ещё 1 комментарий
Теги:

26 ответов

899
Лучший ответ

Вы можете сделать точно такой же вызов с Swift:

Swift 4

В Swift 4 String представляет собой набор значений Character, это не было так в Swift 2 и 3, поэтому вы можете использовать этот более краткий код 1:

let string = "hello Swift"
if string.contains("Swift") {
    print("exists")
}

Свифт 3. 0+

var string = "hello Swift"

if string.range(of:"Swift") != nil { 
    print("exists")
}

// alternative: not case sensitive
if string.lowercased().range(of:"swift") != nil {
    print("exists")
}

Олд Свифт

var string = "hello Swift"

if string.rangeOfString("Swift") != nil{ 
    println("exists")
}

// alternative: not case sensitive
if string.lowercaseString.rangeOfString("swift") != nil {
    println("exists")
}

Я надеюсь, что это полезное решение, так как некоторые люди, в том числе и я, столкнулись с некоторыми странными проблемами, вызвав функцию containsString(). 1

PS. Не забудьте import Foundation

Сноски

  1. Просто помните, что использование функций сбора в строках имеет некоторые крайние случаи, которые могут дать вам неожиданные результаты, например, при работе с эмодзи или другими кластерами графем, такими как буквы с акцентом.
  • 0
    Я понимаю, что Swift находится в бета-версии, удивительно, что многие разработчики переключаются на него в первой бета-версии. Надеюсь, они подают радары.
  • 1
    Я получаю сообщение об ошибке: «Строка» не имеет члена с именем rangeOfString в игровой площадке на бета6. РЕДАКТИРОВАТЬ: потому что у меня не было «импорта фонда»
Показать ещё 16 комментариев
189

Способ расширения

Swift 4

extension String {
    func contains(find: String) -> Bool{
        return self.range(of: find) != nil
    }
    func containsIgnoringCase(find: String) -> Bool{
        return self.range(of: find, options: .caseInsensitive) != nil
    }
}

var value = "Hello world"

print(value.contains("Hello")) // true
print(value.contains("bo"))    // false

print(value.containsIgnoringCase(find: "hello"))    // true
print(value.containsIgnoringCase(find: "Hello"))    // true
print(value.containsIgnoringCase(find: "bo"))       // false

Обычно Swift 4 имеет contains, однако он доступен из iOS 8.0 +


Swift 3.1

Вы можете написать расширение contains: и containsIgnoringCase для String

extension String { 

   func contains(_ find: String) -> Bool{
     return self.range(of: find) != nil
   }

   func containsIgnoringCase(_ find: String) -> Bool{
     return self.range(of: find, options: .caseInsensitive) != nil 
   }
 }

Старая версия Swift

extension String {

    func contains(find: String) -> Bool{
       return self.rangeOfString(find) != nil
     }

    func containsIgnoringCase(find: String) -> Bool{
       return self.rangeOfString(find, options: NSStringCompareOptions.CaseInsensitiveSearch) != nil
     }
}

Пример:

var value = "Hello world"

print(value.contains("Hello")) // true
print(value.contains("bo"))    // false

print(value.containsIgnoringCase("hello"))    // true
print(value.containsIgnoringCase("Hello"))    // true
print(value.containsIgnoringCase("bo"))       // false
  • 6
    чтобы игнорировать регистр, используйте return self.rangeOfString (find, options: NSStringCompareOptions.CaseInsensitiveSearch)! = nil
  • 1
    Нет больше необходимости , если вы не имеете Foundation вокруг ... containsString работает отлично.
Показать ещё 4 комментария
46

В документах кажется, что вызов containsString() в String должен работать:

Swifts Строковый тип легко соединяется с Foundations NSString класс. Если вы работаете с базой Foundation в Cocoa или Cocoa Нажмите, весь API NSString доступен для вызова любого Строковое значение, которое вы создаете, в дополнение к описанным выше функциям String в этой главе. Вы также можете использовать значение String с любым API, который требуется экземпляр NSString.

Однако, похоже, что это не работает.

Если вы попытаетесь использовать someString.containsString(anotherString), вы получите ошибку времени компиляции, в которой указано 'String' does not contain a member named 'containsString'.

Итак, у вас осталось несколько опций, один из которых заключается в явном переносе вашего String в Objective-C с помощью bridgeToObjectiveC(), другие два явно задействуют NSString, а последний включает в себя String до NSString

С помощью моста вы получите:

var string = "hello Swift"
if string.bridgeToObjectiveC().containsString("Swift") {
    println("YES")
}

Явным образом набрав строку как NSString, вы получите:

var string: NSString = "hello Swift"
if string.containsString("Swift") {
    println("YES")
}

Если у вас есть существующий String, вы можете инициализировать NSString из него с помощью NSString (string:):

var string = "hello Swift"
if NSString(string: string).containsString("Swift") {
    println("YES")
}

И, наконец, вы можете применить существующий String к NSString, как показано ниже

var string = "hello Swift"
if (string as NSString).containsString("Swift") {
    println("YES")
}
  • 4
    Последний пример (я не пробовал другие) вылетает для меня на iOS 7 (устройство); Приложения Swift должны нормально работать на iOS 7. Я получаю ошибку [__NSCFString containsString:]: unrecognized selector sent to instance . Кроме того, я не могу найти метод containsString в документации разработчика, чтобы подтвердить, является ли он новым для iOS 8.
  • 0
    Интересно. Я проверял это только на детской площадке. Я попробую позже, когда буду на своем компьютере.
Показать ещё 1 комментарий
35

Другой. Поддерживает регистр и диакритические варианты.

Swift 3.0

struct MyString {
  static func contains(_ text: String, substring: String,
                       ignoreCase: Bool = true,
                       ignoreDiacritic: Bool = true) -> Bool {

    var options = NSString.CompareOptions()

    if ignoreCase { _ = options.insert(NSString.CompareOptions.caseInsensitive) }
    if ignoreDiacritic { _ = options.insert(NSString.CompareOptions.diacriticInsensitive) }

    return text.range(of: substring, options: options) != nil
  }
}

Использование

MyString.contains("Niels Bohr", substring: "Bohr") // true

iOS 9 +

Доступна функция случая и диакритическая нечувствительность, доступная с iOS 9.

if #available(iOS 9.0, *) {
  "Für Elise".localizedStandardContains("fur") // true
}
31

В Xcode 7.1 и Swift 2.1 containsString() работает нормально для меня.

let string = "hello swift"
if string.containsString("swift") {
    print("found swift")
}

Swift 4:

let string = "hello swift"
if string.contains("swift") {
    print("found swift")
}

И пример без учета регистра Swift 4:

let string = "Hello Swift"
if string.lowercased().contains("swift") {
    print("found swift")
}

Или используя нечувствительность к регистру String extension:

extension String {
    func containsIgnoreCase(_ string: String) -> Bool {
        return self.lowercased().contains(string.lowercased())
    }
}

let string = "Hello Swift"
let stringToFind = "SWIFT"
if string.containsIgnoreCase(stringToFind) {
    print("found: \(stringToFind)")  // found: SWIFT
}
print("string: \(string)")
print("stringToFind: \(stringToFind)")

// console output:
found: SWIFT
string: Hello Swift
stringToFind: SWIFT
  • 3
    вам нужно import Foundation , иначе это не сработает.
  • 0
    import UIKit либо import UIKit из import Foundation , по крайней мере с iOS 11 и Swift 4.
Показать ещё 4 комментария
22

В Swift 4.2

использование

func contains(_ str: String) -> Bool

пример

let string = "hello Swift"
let containsSwift = string.contains("Swift")
print(containsSwift) // prints true
  • 4
    Обратите внимание, что для этого необходимо импортировать Foundation.
16

В SWIFT 3.0

let str = "Hello Swift"
if str.lowercased().contains("Swift".lowercased()) {
    print("String Contains Another String")
} else {
    print("Not Exists")
}

Выход

String Contains Another String
14

Вы можете сделать это очень легко в Swift с помощью кода:

let string = "hello Swift";
let subString = (string as NSString).containsString("Swift")
if(subString){println("Exist")}
9

Из всех ответов здесь я думаю, что они либо не работают, либо они немного взломаны (отбрасываются на NSString). Очень вероятно, что правильный ответ на это изменился с различными бета-версиями.

Вот что я использую:

let string: String = "hello Swift"
if string.rangeOfString("Swift") != nil
{
    println("exists")
}

В бета-версии 5 потребовалось "!= nil".

8

Просто добавление к ответам здесь.

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

 - (BOOL)localizedCaseInsensitiveContainsString:(NSString *)aString

Пример:

    import Foundation

    var string: NSString  =  "hello Swift"
   if string.localizedCaseInsensitiveContainsString("Hello") {
    println("TRUE")
}

ОБНОВИТЬ

Это часть Foundation Framework для iOS и Mac OS X 10.10.x и была частью 10.10 во время моей первоначальной публикации.

Сгенерировано документа: 2014-06-05 12:26:27 -0700 Замечания к выпуску OS X Apple Inc., 2014. Все права защищены.

Замечания к выпуску OS X 10.10 Cocoa Foundation Framework

NSString теперь имеет следующие два вспомогательных метода:

- (BOOL)containsString:(NSString *)str;

- (BOOL)localizedCaseInsensitiveContainsString:(NSString *)str;

  • 1
    Имейте в виду, что этот подход требует iOS 8.
  • 0
    @AndrewEbling, пожалуйста, смотрите мое обновление.
6

Здесь вы находитесь:

let s = "hello Swift"
if let textRange = s.rangeOfString("Swift") {
    NSLog("exists")
}
  • 0
    Иногда вам может понадобиться компактная форма следующим образом: let rangeIfExists = string.rangeOfString ("Swift") ?? false, который либо возвращает false как логическое значение, если он не содержится, либо NSRange в противном случае
6

Вот мой первый удар в этом месте на быстрой игровой площадке. Я расширяю String, предоставляя две новые функции (содержит и содержитIgnoreCase)

extension String {
    func contains(other: String) -> Bool{
        var start = startIndex

        do{
            var subString = self[Range(start: start++, end: endIndex)]
            if subString.hasPrefix(other){
                return true
            }

        }while start != endIndex

        return false
    }

    func containsIgnoreCase(other: String) -> Bool{
        var start = startIndex

        do{
            var subString = self[Range(start: start++, end: endIndex)].lowercaseString
            if subString.hasPrefix(other.lowercaseString){
                return true
            }

        }while start != endIndex

        return false
    }
}

Используйте его так:

var sentence = "This is a test sentence"
sentence.contains("this")  //returns false
sentence.contains("This")  //returns true
sentence.containsIgnoreCase("this")  //returns true

"This is another test sentence".contains(" test ")    //returns true

Я бы приветствовал любую обратную связь:)

  • 0
    Следующий шаг: Сделайте это универсальной функцией, которая работает во всех коллекциях Collection :-) Например, проверьте встроенную функцию StartWith (). В варианте «игнорировать регистр» строчные строки следует вводить только один раз (пусть lc = other.lowercaseString перед do)
5

В Swift 3

if((a.range(of: b!, options: String.CompareOptions.caseInsensitive, range: nil, locale: nil)) != nil){
    print("Done")
}
5

Вам не нужно писать какой-либо пользовательский код для этого. Начиная с версии 1.2 у Swift уже были все необходимые методы:

  • получение длины строки: count(string);
  • проверка строки, содержащей строку: contains(string, substring);
  • проверка, начинается ли строка с подстроки: startsWith(string, substring)
  • и т.д.
  • 0
    Swift 2 не то же самое.
  • 2
    Swift 2 : string.hasPrefix («начало»)
4

Здесь вы идете! Готов к Xcode 8 и Swift 3.

import UIKit

let mString = "This is a String that contains something to search."
let stringToSearchUpperCase = "String"
let stringToSearchLowerCase = "string"

mString.contains(stringToSearchUpperCase) //true
mString.contains(stringToSearchLowerCase) //false
mString.lowercased().contains(stringToSearchUpperCase) //false
mString.lowercased().contains(stringToSearchLowerCase) //true
2

Swift 4 способа проверить наличие подстрок, включая необходимый импорт фреймворка Foundation (или UIKit):

import Foundation // or UIKit

let str = "Oh Canada!"

str.contains("Can") // returns true

str.contains("can") // returns false

str.lowercased().contains("can") // case-insensitive, returns true

Если не импортирована str.contains("Can") Foundation (или UIKit), str.contains("Can") выдаст ошибку компилятора.


Этот ответ является регургитирующим ответом manojlds, который является полностью правильным. Я понятия не имею, почему столько ответов проходит так много проблем, чтобы воссоздать String.contains(subString: String) Foundation String.contains(subString: String).

2

Проверьте, содержит ли он 'Hello'

let s = "Hello World"

if s.rangeOfString("Hello") != nil {
    print("Yes it contains 'Hello'")
}
2

Версия Xcode 8/Swift 3:

let string = "hello Swift"

if let range = string.range(of: "Swift") {
    print("exists at range \(range)")
} else {
    print("does not exist")
}

if let lowercaseRange = string.lowercased().range(of: "swift") {
    print("exists at range \(lowercaseRange)")
} else {
    print("does not exist")
}

Вы также можете использовать contains:

string.contains("swift") // false
string.contains("Swift") // true
2

string.containsString доступен только в 10.10 Yosemite (и, возможно, iOS8). Также переместите его на ObjectiveC в 10.9. Вы пытаетесь передать NSString в NSCFString. Я не знаю разницы, но могу сказать 10,9 бар, когда он выполняет этот код в приложении OS X 10.9.

Вот различия в Swift с 10.9 и 10.10: https://developer.apple.com/library/prerelease/mac/documentation/General/Reference/APIDiffsMacOSX10_10SeedDiff/index.html containsString доступен только в 10.10

Диапазон строк выше отлично работает на 10.9. Я нахожу, что разработка на 10.9 является суперстабильной с Xcode beta2. Я не пользуюсь игровыми площадками или версией игровых площадок в командной строке. Я нахожу, что если импортировать правильные фреймворки, автозаполнение очень полезно.

1
// Search string exist in employee name finding.
var empName:NSString! = employeeDetails[filterKeyString] as NSString

Case sensitve search.
let rangeOfSearchString:NSRange! = empName.rangeOfString(searchString, options: NSStringCompareOptions.CaseInsensitiveSearch)

// Not found.
if rangeOfSearchString.location != Foundation.NSNotFound
{
    // search string not found in employee name.
}
// Found
else
{
    // search string found in employee name.
}
0

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

var name = String()  
name = "John has two apples." 

Теперь, в этой конкретной строке, если вы хотите знать, содержит ли она фруктовое название "яблоко" или нет, вы можете сделать,

if name.contains("apple")      
{  
print("Yes , it contains fruit name")    
}    
else      
{    
 print(it does not contain any fruit name)    
}    

Надеюсь, что это работает для вас.

0

Swift 3: Здесь вы можете увидеть мою строку интеллектуального поиска fro string, которая позволяет вам выполнять поиск по строке для просмотра, если она содержит, или, возможно, для фильтрации коллекции на основе текста поиска.

https://github.com/magonicolas/Swift-Smart-String-Search

0

Я нашел несколько интересных вариантов использования. Эти варианты используют метод rangeOfString, и я включаю пример равенства, чтобы показать, как лучше всего использовать функции поиска и сравнения строк в Swift 2.0

//In viewDidLoad() I assign the current object description (A Swift String) to self.loadedObjectDescription
self.loadedObjectDescription = self.myObject!.description

Позже, после внесения изменений в self.myObject, я могу обратиться к после процедур сравнения строк (настройка как ленивых переменных, которые вернуть Bool). Это позволяет проверять состояние в любое время.

lazy var objectHasChanges : Bool = {
        guard self.myObject != nil else { return false }
        return !(self.loadedObjectDescription == self.myObject!.description)
    }()

Вариант этого случается, когда мне иногда приходится анализировать недостающие свойство на этом объекте. Строковый поиск позволяет мне найти для конкретной подстроки установлено значение nil (по умолчанию, когда объект создан).

    lazy var isMissingProperty : Bool = {
        guard self.myObject != nil else { return true }
        let emptyPropertyValue = "myProperty = nil"
        return (self.myObject!.description.rangeOfString(emptyPropertyValue) != nil) ? true : false
    }()
0

В iOS 8 и новее вы можете использовать эти два метода NSString:

@availability(iOS, introduced=8.0)
func containsString(aString: String) -> Bool

@availability(iOS, introduced=8.0)
func localizedCaseInsensitiveContainsString(aString: String) -> Bool
  • 0
    Какие? похоже, его нет в наличии? в версии, которая поставляется с Xcode 6.1
-2

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

import Foundation
...
string.contains("Swift");

Из документов:

Тип Swifts String легко соединяется с классом Foundations NSString. Если вы работаете с платформой Foundation в Cocoa или Cocoa Touch, весь API NSString доступен для вызова любого значения String вы создаете, в дополнение к функциям String, описанным в этой главе. Вы также можете использовать значение String с любым API, для которого требуется экземпляр NSString.

Вам необходимо import Foundation чтобы NSString методы NSString и сделать их доступными для класса Swift String.

  • 0
    Не я, но нет, это не так.
  • 0
    Ага. Пробовал на игровой площадке, в приложении Mac и в приложении iOS. Также пробовал в Playground импортировать Cocoa, UIKit, Foundation и все возможные комбинации трех из них (кроме Cocoa / UIKit, что не имеет смысла)
Показать ещё 1 комментарий
-3

SWIFT 4 - это очень просто!

if (yourString.contains("anyThing")) {
   Print("Exist")
}
  • 1
    Чем это отличается от некоторых других ответов здесь?
  • 1
    $ swift Welcome to Apple Swift version 4.2 (swiftlang-1000.11.37.1 clang-1000.11.45.1). Type :help for assistance. 1> print ("Ping") Ping 2> Print ("Ping") error: repl.swift:2:1: error: use of unresolved identifier 'Print' Print ("Ping") ^~~~~ Предоставляя непроверенный ответ, который не работает. Печать! = Печать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню