Bir dizenin Swift'te başka bir dize içerip içermediğini nasıl kontrol ederim?


535

Gelen Objective-Ckod bir bir alt dize denetlemek için NSStringgeçerli:

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

Ama bunu Swift'te nasıl yaparım?


2
@rckoenes Hızlı yeniyim, bu amacı nasıl yapacağımı biliyorumC
Rajneesh071

1
O zaman neden sadece bir oyun alanına başlayıp denemiyorsun.
rckoenes

Hala etraftaysanız, lütfen kabul edilen cevabı user1021430 ile değiştirin ... doğru
Dan Rosenstark

Yanıtlar:


1044

Aynı aramayı Swift ile de yapabilirsiniz:

Swift 4 ve Swift 5

Swift 4 String bir Characterdeğerler koleksiyonudur, Swift 2 ve 3'te böyle değildi, bu yüzden bu daha kısa kod 1'i kullanabilirsiniz :

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

Swift 3.0 ve üzeri

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")
}

Yaşlı Swift

var string = "hello Swift"

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

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

Umarım bu yararlı bir çözümdür, çünkü ben dahil bazı insanlar arayarak garip sorunlarla karşılaşmıştır containsString(). 1

PS. Unutmaimport Foundation

Dipnotlar

  1. Dizelerde toplama işlevlerini kullanmanın , örneğin emoji veya aksanlı harfler gibi diğer grafik kümeleriyle uğraşırken beklenmedik sonuçlar verebilecek bazı kenar durumları olduğunu unutmayın.

13
Apple'ın belgeleri şöyle diyor: An NSRange structure giving the location and length in the receiver of the first occurrence of aString. Returns {NSNotFound, 0} if aString is not found or is empty (@"").Belki sadece kontrol etmek nildüzgün çalışmaz.
Alex

7
string.lowercaseString.rangeOfString ("swift"). konum! = NSNotFound. Lütfen belgeleri okuyun .. nil nesnesi geri alamazsınız.
TheCodingArt

4
@TheGamingArt Evet yapacaksınız. Swift, NSRange ise {NSNotFound, 0}sizin için sıfır olarak temsil edilmek üzere her şeyi sizin için otomatik olarak döndürür . Gerçek bir aralıksa, sizin için bir Swift Aralığı (isteğe bağlı) olarak temsil edilir. Güzel.
matt

4
Grr. ihtiva edenString, Xcode 6.3.1 sürümünden itibaren bile dokümanda değildir.
Duncan C

19
@TheGoonie: Bu aramıyor NSString's .rangeOfString(). Bu, String' .rangeOfString()olarak ilan edilirfunc rangeOfString(aString: String, options mask: NSStringCompareOptions = default, range searchRange: Range<Index>? = default, locale: NSLocale? = default) -> Range<Index>?
newacct

192

Uzatma yolu

Hızlı 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

Genellikle Swift 4'te yöntem vardır , ancak iOS 8.0+


Hızlı 3.1

Sen uzantıyı yazabilir contains:ve containsIgnoringCaseiçinString

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 
   }
 }

Eski Swift sürümü

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
     }
}

Misal:

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
büyük / küçük harf kullanımı yoksaymak için return self.rangeOfString (find, options: NSStringCompareOptions.CaseInsensitiveSearch)! = nil
masgar

1
FoundationEtrafında yoksa sürece gerek yok ... containsStringiyi çalışıyor.
Dan Rosenstark

5
hızlı 3.0 için. Aşağıya değiştirin: extension String {func include (find: String) -> Bool {return self.range (of: find)! = Nil} func includeIgnoringCase (find: String) -> Bool {return self.range (/: bul , seçenekler: .caseInsensitive)! = nil}}
Michael Shang

Swift 4 için -> uzantı String {func içerir (find: String) -> Bool {dönüş self.range (of: find)! = Nil} func includeIgnoringCase (find: String) -> Bool {return self.range (:: bulmak, seçenekler: .caseInsensitive)! = nil}}
shokaveli

50

Dokümanlardan, containsString()bir String'i çağırmanın çalışması gerektiği anlaşılıyor :

Swift'in String tipi, Foundation'ın NSString sınıfına sorunsuz bir şekilde köprülenir. Kakao veya Kakao Dokunuşundaki Temel çerçevesiyle çalışıyorsanız, bu bölümde açıklanan Dize özelliklerine ek olarak, oluşturduğunuz herhangi bir Dize değerini çağırmak için tüm NSString API'sini kullanabilirsiniz. Dize değerini, NSString örneği gerektiren herhangi bir API ile de kullanabilirsiniz.

Ancak, bu şekilde çalışmıyor gibi görünüyor.

Kullanmaya çalışırsanız someString.containsString(anotherString), derleme zamanı hatası alırsınız 'String' does not contain a member named 'containsString'.

Yani, bir kaç seçeneğiniz kaldı, bunlardan biri açıkça açıkça StringObjective-C'ye köprülemek ve bridgeToObjectiveC()diğer ikisini kullanarak açıkça kullanmaktır NSStringve sonuncusu StringbirNSString

Köprü kurarak şunları elde edersiniz:

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

Dizeyi açıkça bir olarak yazarak NSStringşunları elde edersiniz:

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

Mevcut Stringbir hesabınız varsa, NSString (string :) kullanarak bir NSString başlatabilirsiniz:

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

Ve son olarak, varolan yayınlayabileceğim Stringbir etmek NSStringaşağıda

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

4
Son örnek (başkalarını denemedim) iOS 7'de (cihaz) benim için çöküyor; Swift uygulamaları iOS 7'de iyi çalışmalıdır. Aldığım hata [__NSCFString containsString:]: unrecognized selector sent to instance. Ayrıca, containsStringiOS 8 için yeni olup olmadığını onaylamak için geliştirme belgelerinde yöntemi bulamıyorum .
Jason Leach

İlginç. Bunu sadece bir oyun alanında test ettim. Bilgisayarımdayken daha sonra deneyeceğim.
Cezar

üçüncü ve dördüncü seçenekler derleyicinin izin verdiği tek seçenektir. iOS 7'de beta 4'te her ikisi de benim için
çöktü

38

Bir diğeri. Vaka ve aksan seçeneklerini destekler.

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
  }
}

kullanım

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

iOS 9 ve sonraki sürümleri

İOS 9'dan beri kasa ve aksan duyarsız işlevi mevcut.

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

31

Xcode 7.1 ve Swift 2.1'den itibaren containsString()benim için iyi çalışıyor.

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

Hızlı 4:

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

Ve büyük / küçük harfe duyarlı olmayan Swift 4 örneği:

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

Veya büyük / küçük harfe duyarlı olmayan bir Stringuzantı kullanarak :

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
gerek import Foundation, aksi takdirde bu işe yaramaz.
Andrii Chernenko

Her ikisi import UIKitde import Foundation, en azından iOS 11 ve Swift 4 ile gerekli.
Murray Sagal

Ancak bu büyük / küçük harfe duyarlıdır. Davayı görmezden gelirken karşılaştırma nasıl yapılır. Java String.equalsIgnoreCase (anotherString) gibi mi?
zulkarnain shah

@zulkarnainshah Cevaba bir örnek ekledim.
Murray Sagal

@MurraySagal Bu hala duyarsız arama değildir. Orijinal dizeyi küçük harfe dönüştürüyorsunuz ve daha sonra bunu küçük harfli dizeyle açıkça karşılaştırıyorsunuz. İşi yapacak, ama bunu yapmak için ideal bir yol değil
zulkarnain shah

22

Swift 4.2 içinde

kullanım

func contains(_ str: String) -> Bool

Misal

let string = "hello Swift"
let containsSwift = string.contains("Swift")
print(containsSwift) // prints true

4
Bunun için Foundation'ı içe aktarmanız gerektiğini lütfen unutmayın.
rmaddy

16

> SWIFT 3.0'DA

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

Çıktı

String Contains Another String

15

Swift'te kodu kullanarak bunu kolayca yapabilirsiniz:

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

10

Buradaki cevaplara bir zeyilname.

Ayrıca aşağıdakileri kullanarak yerel bir büyük / küçük harfe duyarlı olmayan test de yapabilirsiniz:

 - (BOOL)localizedCaseInsensitiveContainsString:(NSString *)aString

Misal:

    import Foundation

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

GÜNCELLEME

Bu, iOS ve Mac OS X 10.10.x için Foundation Framework'ün bir parçasıdır ve Orijinal Gönderim Zamanında 10.10'un bir parçasıydı.

Oluşturulan Belge: 2014-06-05 12:26:27 -0700 OS X Sürüm Notları Telif Hakkı © 2014 Apple Inc. Tüm Hakları Saklıdır.

OS X 10.10 Sürüm Notları Kakao Vakfı Çerçevesi

NSString artık aşağıdaki iki kolaylık yöntemine sahiptir:

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

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


1
Bu yaklaşımın iOS 8 gerektirdiğini unutmayın.
Andrew Ebling

9

İşte bu hızlı oyun alanında ilk bıçaklamam. Ben iki yeni işlev sağlayarak String içerir (içerir ve içerirIgnoreCase)

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
    }
}

Bu şekilde kullanın

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

Herhangi bir geri bildirim hoş geldiniz :)


Sonraki adım: Bunu tüm Koleksiyonlar üzerinde çalışan genel bir işlev haline getirin :-) Örneğin, startsWith () yerleşik işlevini kontrol edin. 'Yoksay durumda' varyantında, dizeleri yalnızca bir kez küçük harfle yazın (let lc = other.lowercaseString do önce)
hnh

9

Buradaki tüm cevaplar arasında, ya işe yaramıyorlar ya da biraz hack (NSString'e geri dönüyorlar). Farklı beta sürümleriyle buna doğru cevabın değişmiş olması muhtemeldir.

İşte ne kullanıyorum:

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

Beta! İle "! = Nil" gerekli hale geldi.


6

Buyrun:

let s = "hello Swift"
if let textRange = s.rangeOfString("Swift") {
    NSLog("exists")
}

Bazen aşağıdaki gibi kompakt bir forma ihtiyacınız olabilir: let rangeIfExists = string.rangeOfString ("Swift") ?? false, içerdiği takdirde boole olarak false döndürür veya aksi takdirde NSRange
Stéphane de Luca

5

Bunun için herhangi bir özel kod yazmanıza gerek yoktur. 1.2 sürümünden başlayarak Swift zaten ihtiyacınız olan tüm yöntemlere sahipti:

  • dize uzunluğu alma count(string):;
  • dizenin alt dize içerip içermediğini denetleme contains(string, substring):;
  • dizenin alt dize ile başlayıp başlamadığını kontrol etme: startsWith(string, substring)
  • ve benzeri.

Swift 2 aynı değil.
Suragch

2
Swift 2 : string.hasPrefix (“start”)
SwiftArchitect

5

Swift 3'te

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

4

Hadi bakalım! Xcode 8 ve Swift 3 için hazır.

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

3

string.containsString yalnızca 10.10 Yosemite (ve muhtemelen iOS8) sürümlerinde kullanılabilir. Ayrıca 10.9 yılında ObjectiveC çöküyor onu köprüler. NSString'i NSCFString'e geçirmeye çalışıyorsunuz. Farkı bilmiyorum, ama bir OS X 10.9 uygulamasında bu kodu çalıştırdığında 10.9 barfs diyebilirim.

Swift'te 10.9 ve 10.10 ile farklar: https://developer.apple.com/library/prerelease/mac/documentation/General/Reference/APIDiffsMacOSX10_10SeedDiff/index.html yalnızca 10.10'da kullanılabilir

Yukarıdaki String aralığı 10.9'da harika çalışıyor. Ben 10.9 üzerinde geliştirme Xcode beta2 ile süper kararlı buluyorum. Oyun alanlarını veya oyun alanlarının komut satırı sürümünü kullanmıyorum. Uygun çerçevelerin içe aktarılıp aktarılmadığını otomatik tamamlamanın çok yararlı olduğunu anlıyorum.


3

Hızlı 4'te ve yeni sözdizimi ile

string.contains("Swift 4 is the best")

string sizin string değişkeninizdir


2

Xcode 8 / Swift 3 sürümü:

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")
}

Ayrıca şunları kullanabilirsiniz contains:

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

2

'Merhaba' içerip içermediğini kontrol edin

let s = "Hello World"

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

2

Gerekli Foundation(veya UIKit) çerçeve içe aktarma dahil alt dizeleri kontrol etmek için Swift 4 yolu :

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

Sürece Foundation(veya UIKit) çerçeve ithal edilir, str.contains("Can")bir derleyici hata verecektir.


Bu cevap manojlds'in cevabını tamamen doğru olan cevabını canlandırıyor . Pek çok cevaplar yeniden yaratmak bu kadar sorun geçmesi niçin hiçbir fikrim yok Foundation'in String.contains(subString: String)yöntemi.


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

İOS 8 ve daha yeni sürümlerde şu iki NSStringyöntemi kullanabilirsiniz :

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

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

Ne? kullanılabilir değil gibi görünüyor? 6.1
Ali

0

Birkaç ilginç kullanım durumu buldum. Bu varyantlar rangeOfString yöntemini kullanır ve Swift 2.0'da Dizelerin arama ve karşılaştırma özelliklerini en iyi nasıl kullanabileceğini göstermek için eşitlik örneğini eklerim

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

Daha sonra self.myObject üzerinde değişiklikler yaptıktan sonra, aşağıdaki dize karşılaştırma rutinlerine başvurabilirim (bir Bool döndüren tembel değişkenler olarak kurulum). Bu, herhangi bir zamanda durumu kontrol etmeyi sağlar.

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

Bunun bir varyantı bazen bu nesne üzerinde eksik bir özelliği analiz etmem gerektiğinde olur. Dize araması, nil olarak ayarlanan belirli bir alt dizeyi bulmama izin veriyor (bir nesne oluşturulduğunda varsayılan).

    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

Bir Dizenin içinde başka bir Alt Dizenin bulunup bulunmadığını kontrol etmek istiyorsanız, bunu da kontrol edebilirsiniz,

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

Şimdi, bu özel dizede 'apple' meyve adı içerip içermediğini bilmek istiyorsanız,

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

Umarım bu sizin için çalışır.


-2

Sadece bahsettiklerinizi yapabilirsiniz:

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

Dokümanlardan:

Swift'in Stringtürü Foundation'ın NSString sınıfına sorunsuz bir şekilde köprülenir . Kakao veya Kakao Dokunuşundaki Temel çerçevesiyle çalışıyorsanız , bu bölümde açıklanan Dize özelliklerine ek olarak oluşturduğunuz NSStringherhangi bir Stringdeğeri çağırmak için tüm API kullanılabilir . Dize değerini, NSString örneği gerektiren herhangi bir API ile de kullanabilirsiniz.

Sen gerekir import Foundationköprü NSStringyöntem ve Swift'in String sınıfına kullanılabilir hale getirmek.


Ben değil, hayır.
Cezar

Evet. Bir Oyun Alanında, bir Mac Uygulamasında ve bir iOS uygulamasında denedim. Ayrıca Kakao, UIKit, Vakıf ve bunların üçünün tüm olası kombinasyonlarını ithal eden Oyun Alanlarında da denendi (anlamsız olan Kakao / UIKit hariç)
Cezar

Swift 1.2'den artık böyle değil
Kelvin Lau

-4

SWIFT 4 çok kolay !!

if (yourString.contains("anyThing")) {
   Print("Exist")
}

1
Buradaki diğer cevapların birkaçından farkı nedir?
Ashley Mills

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") ^~~~~ Çalışmayan test edilmemiş bir cevap sağlayarak. Yazdır! = Yazdır.
Fred Gannett
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.