Swiftで文字列に別の文字列が含まれているかどうかを確認するにはどうすればよいですか?


535

Objective-C部分文字列をチェックするコードNSStringは次のとおりです。

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

しかし、どうすればSwiftでこれを実行できますか?


2
@rckoenes私はSwiftを初めて使用しています。この目的を達成する方法を知っていますC
Rajneesh071

1
それでは、遊び場を始めて試してみませんか。
rckoenes 14年

あなたがまだ残っている場合は、user1021430によって1に受け入れ答えを変更してください...それは正しいです
ダンRosenstark

回答:


1044

Swiftでもまったく同じように呼び出すことができます。

Swift 4およびSwift 5

Swift 4ではStringはCharacter値のコレクションですが、Swift 2および3ではこれとは異なり、より簡潔なコード1を使用できます。

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

Swift 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. 文字列でコレクション関数を使用すると、たとえば絵文字やアクセント付き文字のような他の書記素クラスタを処理する場合など、予期しない結果をもたらす可能性があるエッジケースがあることに注意してください。

13
Appleのドキュメントによると: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。ドキュメントを読んでください。nilオブジェクトは返されません。
TheCodingArt 2014年

4
@TheGamingArtはい、そうします。Swiftは全体を自動的にラウンドトリップするので、NSRangeが{NSNotFound, 0}nilの場合はそれがnilとして表されます。実際の範囲である場合、Swift Range(オプション)として表示されます。涼しい。
マット2014年

4
Grr。XString 6.3.1でも、containsStringはドキュメントに含まれていません。
ダンカン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以降から利用できます


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
ケースの使用リターンself.rangeOfStringを無視する(、オプションを見つける:NSStringCompareOptions.CaseInsensitiveSearchを)= nilの!
masgar

1
あなたがFoundation周りにいない限り、もう必要ありません... containsStringうまくいきます。
Dan Rosenstark

5
Swift 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 2017年

50

ドキュメントから、containsString()文字列の呼び出しは機能するはずです:

SwiftのString型はFoundationのNSStringクラスにシームレスにブリッジされます。CocoaまたはCocoa TouchのFoundationフレームワークを使用している場合、この章で説明する文字列機能に加えて、作成した任意の文字列値を呼び出すためにNSString API全体を使用できます。NSStringインスタンスを必要とする任意のAPIでString値を使用することもできます。

ただし、そのようには動作しないようです。

使用しようとするとsomeString.containsString(anotherString)、次のようなコンパイル時エラーが発生します'String' does not contain a member named 'containsString'

そのため、いくつかのオプションが残っています。そのうちの1つは、他の2つをString使用して明示的にObjective-Cにブリッジすることであり、最後の1つは、bridgeToObjectiveC()NSStringStringNSString

ブリッジすることで、以下が得られます。

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(デバイス)でクラッシュします。SwiftアプリはiOS 7で問題なく動作するはずです[__NSCFString containsString:]: unrecognized selector sent to instance。エラーはです。また、私は方法を見つけることができないcontainsStringのiOS 8のための新しいかどうかを確認するためのdevのドキュメント内を
ジェイソン・リーチ

面白い。私は遊び場でこれをテストしただけです。後で自分のコンピューターで試してみるつもりです。
セザール2014年

3番目と4番目のオプションは、コンパイラーが許可する唯一のオプションです。iOSの7のベータ4で私のためにクラッシュの両方
ミナミ

38

別のもの。大文字と小文字区別オプションをサポートします。

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

スウィフト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 UIKitimport Foundation少なくとも11のiOSとスイフト4と、必要とされる
マレーSagal

ただし、大文字と小文字は区別されます。大文字と小文字を区別せずに、どのように比較を行いますか。java String.equalsIgnoreCase(anotherString)のように?
zulkarnain shah 2017

@zulkarnainshah私は答えに例を追加しました。
Murray Sagal

@MurraySagalそれでも、大文字と小文字を区別しない検索は行われません。元の文字列を小文字に変換し、それを明示的に小文字の文字列と比較しています。それは仕事をしますが、それはそれをするための理想的な方法ではありません
ズルカルナインシャー

22

Swift 4.2では

使用する

func contains(_ str: String) -> Bool

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

4
Foundationをインポートする必要があることに注意してください。
rmaddy 2017年

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

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 Frameworkの 一部であり、最初の投稿時の10.10の一部でした。

生成されたドキュメント:2014-06-05 12:26:27 -0700 OS XリリースノートCopyright©2014 Apple Inc. All Rights Reserved。

OS X 10.10リリースノート Cocoa Foundationフレームワーク

NSStringには、次の2つの便利なメソッドがあります。

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

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


1
このアプローチは、iOSの8必要ですので注意してください
アンドリューEbling

9

これが、すばやい遊び場での私の最初の刺しです。2つの新しい関数(containsとcontainsIgnoreCase)を提供して文字列を拡張します

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()組み込み関数をチェックアウトします。「大文字と小文字を区別しない」バリアントでは、文字列を1回だけ小文字に変換します(doの前にlc = other.lowercaseStringとしましょう)
hnh

9

ここでのすべての回答のうち、私はそれらが機能しないか、または少しハック(NSStringにキャストバック)していると思います。これに対する正しい答えは、異なるベータリリースで変更された可能性が非常に高いです。

これが私が使うものです:

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

Beta 5では「!= nil」が必須になりました。


6

はい、どうぞ:

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

場合によっては、次のようなコンパクトなフォームが必要になることがあります:let rangeIfExists = string.rangeOfString( "Swift")?? falseのいずれかを返すbooleanとして偽それが含まれていない場合やNSRangeそう
ステファン・デ・ルカ

5

このためのカスタムコードを記述する必要はありません。1.2バージョンから、Swiftには必要なすべてのメソッドがすでにあります。

  • 文字列の長さを取得:count(string);
  • 文字列に部分文字列が含まれているかどうかの確認:contains(string, substring);
  • 文字列が部分文字列で始まるかどうかの確認: startsWith(string, substring)
  • や。。など。

Swift 2は同じではありません。
Suragch、2015年

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

5

Swift 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は10.10でのみ使用可能です

上記の文字列の範囲は10.9でうまく機能します。10.9での開発はXcode beta2で非常に安定しています。プレイグラウンドを使用したり、プレイグラウンドのコマンドラインバージョンを使用したりしていません。適切なフレームワークがインポートされている場合、オートコンプリートが非常に役立ちます。


3

Swift 4の新しい構文を使用すると、

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

stringは文字列変数です


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

「こんにちは」が含まれているかどうかを確認します

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以降では、次の2つの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アプリで試してみました。また、Cocoa、UIKit、Foundation、およびそれらの3つのすべての可能な組み合わせ(Cocoa / UIKitは意味をなさないため)をインポートするPlaygroundでも試しました
Cezar

これはSwift 1.2の時点では当てはまりません
ケルビンラウ

-4

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") ^~~~~ 機能しないテストされていない回答を提供する。印刷!=印刷。
Fred Gannett、2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.