web-dev-qa-db-ja.com

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

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

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

しかし、Swiftでこれを行うにはどうすればよいですか?

476
Rajneesh071

Swiftでもまったく同じ呼び出しができます。

スイフト4

Swift 4ではStringはCharacter値のコレクションです。Swift2と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. Stringsでコレクション関数を使用すると Edgeの場合がある ということを思い出してください。 g。絵文字やアクセント文字のような他の書記素クラスタを扱うとき。
908
Jens Wirth

延長方法

スイフト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 methodを持っていますが、iOS 8.0以降から利用可能です


スイフト3.1

containsIgnoringCaseのために拡張子contains: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
184
Maxim Shoustin

ドキュメントから、文字列で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つは、bridgeToObjectiveC()を使用してStringをObjective-Cに明示的にブリッジすることです。他の2つはNSStringと最後のStringNSStringにキャストする必要があります

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

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(string :)を使用して、そこからNSStringを初期化できます。

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

そして最後に、以下のように既存のStringNSStringにキャストできます。

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

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

スイフト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
}
36
Evgenii

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
31
Murray Sagal

Swift 4.2では

つかいます

func contains(_ str: String) -> Bool

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

> IN 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
16
Ashok R

Swiftでは、次のコードを使って非常に簡単にこれを行うことができます。

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

ここに挙げたすべての答えのうち、うまくいかないか、あるいはちょっとしたハック(NSStringにキャストバック)のどちらかだと思います。これに対する正しい答えは、さまざまなベータリリースによって変わった可能性が非常に高いです。

これが私が使っているものです:

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

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

9
user1021430

ここに答えへの単なる補遺。

以下を使用して、ローカルの大文字と小文字を区別しないテストを実行することもできます。

 - (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の一部でした。

Document Generated:2014-06-05 12:26:27 -0700 OS XリリースノートCopyright©2014 Apple Inc.無断複写・転載を禁じます。

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

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

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

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

9
markhunte

これがSwiftの遊び場での私の最初の刺し傷です。 2つの新しい関数(containsとcontainsIgnoreCase)を提供してStringを拡張します。

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

私はどんなフィードバックでも歓迎します:)

8
Ken

はい、どうぞ:

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

スウィフト3

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

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

  • 文字列の長さを取得する:count(string);
  • 文字列に部分文字列が含まれているかどうかをチェックします。contains(string, substring);
  • 文字列が部分文字列で始まっているかどうかのチェック:startsWith(string, substring)
  • や。。など。
5
Max Ivashkevich

どうぞ! 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
4
Carlitos

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でうまく機能します。 Xcode beta2では、10.9での開発が非常に安定していることがわかりました。私はプレイグラウンドを使用したり、コマンドライン版のプレイグラウンドを使用したりしません。適切なフレームワークがインポートされている場合、オートコンプリートは非常に役立ちます。

3
Goodtime

「Hello」が含まれているか確認してください

let s = "Hello World"

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

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

Foundation(またはUIKit)フレームワークがインポートされない限り、str.contains("Can")はコンパイラエラーを出します。


この答えは manojldsの答え を逆流させている、これは完全に正しいです。なぜFoundationString.contains(subString: String)メソッドを作り直すのに非常に多くの答えがそれほど多くの問題を経験するのか私にはわかりません。

2
NonCreature0714

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
JAL

Swift 4の新構文では、

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

stringはあなたの文字列変数です

1
100tomer
// 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.
}
1
abhi

ある文字列にその中に別のサブ文字列が含まれているかどうかを確認したい場合は、このようにして確認できます。

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

これがあなたのために働くことを願っています。

0
Varsha Shivhare

興味深いユースケースがいくつかあります。これらの変種はrangeOfStringメソッドを利用しており、Swift 2.0のStringsの検索機能と比較機能をどのように使用するのがよいかを示すために、等号の例を含めます

//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
Tommie C.

Swift 3: ここでは、文字列を検索するための文字列検索、または検索テキストに基づいてコレクションをフィルタリングするためのスマート検索拡張機能を見ることができます。

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

IOS 8以降では、次の2つのNSStringメソッドを使用できます。

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

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