Swift에서 문자열에 다른 문자열이 포함되어 있는지 어떻게 확인합니까?


535

에서 Objective-C코드에서 문자열을 확인 할 NSString수 있습니다 :

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

그러나 Swift에서 어떻게해야합니까?


2
@rckoenes 나는 새롭다. 나는이 목표를 수행하는 방법을 알고있다.
Rajneesh071

1
그럼 그냥 놀이터를 시작하고 시험해 보지 않겠습니까?
rckoenes 2018 년

여전히 주위에 있다면, user1021430의 답변으로 답변을 변경하십시오 ... 맞습니다
Dan Rosenstark

답변:


1044

Swift로 정확히 같은 호출을 할 수 있습니다 :

스위프트 4 & 스위프트 5

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

추신. 잊지 마세요import Foundation

각주

  1. Strings에서 수집 함수를 사용 하면 예를 들어 이모티콘이나 악센트 문자와 같은 다른 grapheme 클러스터를 다룰 때 예기치 않은 결과를 줄 수있는 몇 가지 경우 가 있음을 기억하십시오 .

13
애플의 문서에 따르면 : 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 (@"").아마도 확인 nil만으로는 제대로 작동하지 않을 수 있습니다.
Alex

7
string.lowercaseString.rangeOfString ( "swift"). location! = NSNotFound. 문서를 읽으십시오. 당신은 아무 것도 돌려받지 못할 것입니다.
TheCodingArt

4
@TheGamingArt 그렇습니다. Swift는 모든 것을 자동으로 왕복 처리하여 NSRange가 {NSNotFound, 0}nil 인 경우 자동으로 표시됩니다. 실제 범위 인 경우 스위프트 범위 (선택 사항)로 표시됩니다. 멋있는.
matt

4
Grr. containsString은 Xcode 6.3.1부터 문서에 없습니다.
Duncan C

19
@TheGoonie :이 호출되지 않는다 NSString.rangeOfString(). 이 호출 String.rangeOfString()로 선언,func rangeOfString(aString: String, options mask: NSStringCompareOptions = default, range searchRange: Range<Index>? = default, locale: NSLocale? = default) -> Range<Index>?
newacct

192

확장 방법

스위프트 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 에는 방법 이 포함되어 있지만 iOS 8.0 이상에서 사용할 수 있습니다.


스위프트 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 
   }
 }

이전 스위프트 버전

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
masgar

1
당신이 Foundation주위에 없는 한 더 이상 필요하지 않습니다 ... containsString잘 작동합니다.
Dan Rosenstark 2016 년

5
신속한 3.0. 아래로 변경 : extension String {func contains (find : String)-> Bool {return self.range (of : find)! = nil} func containsIgnoringCase (find : String)-> Bool {return self.range (of : find , 옵션 : .caseInsensitive)! = nil}}
Michael Shang

Swift 4-> 확장 문자열 {func contains (find : String)-> Bool {return self.range (of : find)! = nil} func containsIgnoringCase (find : String)-> Bool {return self.range (of : 찾기, 옵션 : .caseInsensitive)! = nil}}
shokaveli

50

문서에서 containsString()문자열 을 호출 하면 작동하는 것 같습니다 .

Swift의 String 유형은 Foundation의 NSString 클래스와 완벽하게 연결됩니다. Cocoa 또는 Cocoa Touch에서 Foundation 프레임 워크를 사용하는 경우이 장에서 설명하는 String 기능 외에도 전체 NSString API를 사용하여 생성 한 모든 String 값을 호출 할 수 있습니다. NSString 인스턴스가 필요한 API와 함께 String 값을 사용할 수도 있습니다.

그러나 그런 식으로 작동하지 않는 것 같습니다.

을 사용하려고 someString.containsString(anotherString)하면 컴파일 시간 오류가 발생합니다.'String' does not contain a member named 'containsString' .

따라서 몇 가지 옵션이 있습니다. 그중 하나는 명시 적으로 다른 두 가지 String를 사용하여 Objective-C에 명시 적으로 브리지 하는 것입니다.bridgeToObjectiveC()NSStringString 로를NSString

브리징을 통해 다음을 얻을 수 있습니다.

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

문자열을 명시 적으로 입력 NSString하면 다음을 얻을 수 있습니다.

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

기존이있는 경우 StringNSString (string :)을 사용하여 NSString을 초기화 할 수 있습니다.

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 (장치)에서 마지막 예제 (다른 시도하지 않았습니다)가 충돌합니다. 스위프트 앱은 iOS 7에서 제대로 실행되어야합니다 [__NSCFString containsString:]: unrecognized selector sent to instance. 내가 얻는 오류는 입니다. 또한 containsString개발자 문서에서 iOS 8의 새로운 기능인지 확인할 수있는 방법 을 찾을 수 없습니다.
Jason Leach

흥미 롭군 나는 이것을 놀이터에서만 테스트했습니다. 컴퓨터에있을 때 나중에 다시 시도하겠습니다.
Cezar

세 번째 및 네 번째 옵션은 컴파일러가 허용하는 유일한 옵션입니다. 둘 다 iOS 7 베타 4에서 충돌합니다.
palmi

38

다른 것. 대소 문자 및 분음 부호 옵션을 지원합니다.

스위프트 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")
}

스위프트 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 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그렇지 않으면이 작동하지 않습니다.
Andrii Chernenko 2016 년

어느 쪽 import UIKit의는 import Foundation아이폰 OS (11)와 스위프트 (4)와 최소 필요합니다
머레이 사갈

그러나 대소 문자를 구분합니다. 대소 문자를 무시하면서 어떻게 비교합니까? java String.equalsIgnoreCase (anotherString) 에서처럼?
zulkarnain shah

@zulkarnainshah 나는 대답에 예를 추가했습니다.
Murray Sagal

@MurraySagal 여전히 대소 문자를 구분하지 않는 검색입니다. 원래 문자열을 소문자로 변환 한 다음 소문자 문자열과 명시 적으로 비교합니다. 이 일을 할 것이지만 그게없는 것을 할 수있는 이상적인 방법
제작 : Zulkarnain 샤

22

스위프트 4.2

사용하다

func contains(_ str: String) -> Bool

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

4
Foundation을 가져와야합니다.
rmaddy

16

> 스위프트 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

15

코드를 사용하여 Swift에서 매우 쉽게 수행 할 수 있습니다.

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

10

여기에 대한 답변에 대한 부록.

다음을 사용하여 대소 문자를 구분하지 않는 테스트를 수행 할 수도 있습니다.

 - (BOOL)localizedCaseInsensitiveContainsString:(NSString *)aString

예:

    import Foundation

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

최신 정보

이것은 iOS 및 Mac OS X 10.10.x 용 Foundation 프레임 워크의 일부이며 원래 게시 당시 10.10의 일부였습니다.

생성 된 문서 : 2014-06-05 12:26:27 -0700 OS X 릴리스 노트 저작권 © 2014 Apple Inc. 모든 권리 보유.

OS X 10.10 릴리스 노트 Cocoa Foundation Framework

NSString에는 다음과 같은 두 가지 편리한 방법이 있습니다.

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

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


1
이 방법을 사용하려면 iOS 8이 필요합니다.
Andrew Ebling

9

스위프트 놀이터에서 이것에 대한 나의 첫 찌르기입니다. 두 가지 새로운 기능 (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

나는 어떤 의견을 환영합니다 :)


다음 단계 : 모든 Collection의 :-)에서 작동하는 일반적인 함수로 만듭니다. 예를 들어 startsWith () 내장 함수를 체크 아웃하십시오. 'ignore case'변형에서는 문자열을 한 번만 소문자로 입력하십시오 (작업 전에 lc = other.lowercaseString 사용)
hnh

9

여기에있는 모든 대답 중, 나는 그들이 작동하지 않거나 약간의 해킹이라고 생각합니다 (NSString으로 다시 캐스팅). 이에 대한 정답이 다른 베타 버전으로 변경되었을 가능성이 큽니다.

내가 사용하는 것은 다음과 같습니다.

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

베타 5에서는 "! = nil"이 필요합니다.


6

여기 있어요:

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

때때로 다음과 같은 간단한 형식이 필요할 수 있습니다. let rangeIfExists = string.rangeOfString ( "Swift") ?? 포함되지 않은 경우 부울로 false를 반환하거나 그렇지 않으면 NSRange
Stéphane de Luca

5

이를 위해 사용자 정의 코드를 작성할 필요가 없습니다. 1.2 버전부터 Swift에는 필요한 모든 방법이 이미 있습니다.

  • 문자열 길이를 얻는 중 : count(string);
  • 문자열에 하위 문자열이 포함되어 있는지 확인 : contains(string, substring);
  • 문자열이 하위 문자열로 시작하는지 확인 : startsWith(string, substring)

스위프트 2는 동일하지 않습니다.
Suragch

2
스위프트 2 : string.hasPrefix는 ( "시작")
SwiftArchitect

5

스위프트 3 년

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

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

3

string.containsString은 10.10 Yosemite (및 아마도 iOS8)에서만 사용할 수 있습니다. 또한 ObjectiveC에 연결하면 10.9에서 충돌이 발생합니다. NSString을 NSCFString에 전달하려고합니다. 차이점을 모르지만 OS X 10.9 앱 에서이 코드를 실행할 때 10.9 barfs라고 말할 수 있습니다.

다음은 Swift와 10.9 및 10.10의 차이점입니다. https://developer.apple.com/library/prerelease/mac/documentation/General/Reference/APIDiffsMacOSX10_10SeedDiff/index.html containsString containsString은 10.10에서만 사용할 수 있습니다

위의 문자열 범위는 10.9에서 훌륭하게 작동합니다. 10.9에서 개발하는 것이 Xcode beta2로 매우 안정적이라는 것을 알았습니다. 나는 통해 놀이터 나 운동장의 명령 행 버전을 사용하지 마십시오. 적절한 프레임 워크를 가져 오면 자동 완성이 매우 도움이됩니다.


3

swift 4의 새로운 구문을 사용하면

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

문자열은 문자열 변수입니다


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

'Hello'가 포함되어 있는지 확인하십시오.

let s = "Hello World"

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

2

필요한 Foundation(또는 UIKit) 프레임 워크 가져 오기를 포함하여 하위 문자열을 확인하는 Swift 4 방법 :

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

Foundation(또는 UIKit) 프레임 워크를 가져 오지 않으면 str.contains("Can")컴파일러 오류가 발생합니다.


이 답변은 manojlds의 답변을 철회하고 있습니다. 왜 그렇게 많은 답변이 너무 많은 문제를 겪고 FoundationString.contains(subString: String)방법 을 재현하는 지 모릅니다 .


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

iOS 8 이상에서는 다음 두 가지 NSString방법을 사용할 수 있습니다 .

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

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

뭐? 사용할 수없는 것 같습니까? xcode 6.1과 함께 제공되는 버전에서
Ali

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

한 문자열에 다른 하위 문자열이 포함되어 있는지 확인하려면 다음과 같이 확인할 수도 있습니다.

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

이 특정 문자열에서 과일 이름 'apple'이 포함되어 있는지 여부를 알고 싶다면 할 수 있습니다.

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

이것이 효과가 있기를 바랍니다.


-2

당신은 당신이 언급 한 것을 할 수 있습니다 :

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

문서에서 :

스위프트 String타입은 재단의 NSString 클래스와 완벽하게 연결되어 있습니다. Cocoa 또는 Cocoa Touch에서 Foundation 프레임 워크를 NSString사용하는 String경우이 장에서 설명하는 문자열 기능 외에도 전체 API를 사용하여 생성 한 모든 값 을 호출 할 수 있습니다. NSString 인스턴스가 필요한 API와 함께 String 값을 사용할 수도 있습니다.

당신은 할 필요가 import Foundation브리지에 NSString방법 및 스위프트의 String 클래스에 사용할 수 있도록.


나도 아니에요.
Cezar

네. 운동장, Mac 앱 및 iOS 앱에서 시도했습니다. 또한 놀이터 (이해가되지 않습니다 코코아 / UIKit 제외) 코코아, UIKit, 재단, 그 중 세 가지의 가능한 모든 조합을 수입하려고
세자르

스위프트 1.2
켈빈 라우

-4

SWIFT 4는 매우 쉽습니다!

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

1
이것은 다른 답변들과 어떻게 다릅니 까?
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") ^~~~~ 작동하지 않는 테스트되지 않은 답변을 제공합니다. 인쇄! = 인쇄.
Fred Gannett
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.