如何在Swift中检查一个字符串是否包含另一个字符串?


535

Objective-C代码中检查的子字符串NSString是:

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

但是我该如何在Swift中做到这一点?


2
@rckoenes我是新手,我知道如何做到这一目标C
Rajneesh071 2014年

1
那你为什么不开个操场试试呢。
rckoenes 2014年

如果您仍在附近,请将user1021430接受的答案更改为一个答案...是正确的
Dan Rosenstark 2015年

Answers:


1044

您可以使用Swift进行完全相同的调用:

Swift 4和Swift 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个

PS。别忘了import Foundation

脚注

  1. 请记住,在Strings上使用collection函数有一些边缘情况,这些情况可能会给您带来意想不到的结果,例如,在处理表情符号或其他带重音字母的字素簇时。

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无法正常工作。
亚历克斯

7
string.lowercaseString.rangeOfString(“ swift”)。location!= NSNotFound。请阅读文档。.您将不会返回nil对象。
TheCodingArt 2014年

4
@TheGamingArt是的,你会的。Swift会自动为您处理整个过程,因此如果NSRange {NSNotFound, 0}表示为nil,则表示为nil。如果它是实际范围,则将其表示为Swift Range(可选)。凉。
马特2014年

4
r 甚至从Xcode 6.3.1开始,docs中都没有containsString。
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>?
所谓

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:containsIgnoringCaseString

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
masgar

1
除非没有必要,否则不再需要Foundation... containsString可以正常工作。
Dan Rosenstark '16

5
迅速3.0。更改为以下内容:扩展字符串{{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->扩展String {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()String应该可以:

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通过使用bridgeToObjectiveC()其他两个明确NSString涉及String到an 的方式将您显式地连接到Objective-C,最后一个涉及将强制转换为anNSString

通过桥接,您将获得:

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

最后,您可以将现有对象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
杰森·利奇

有趣。我只在操场上测试过。稍后在计算机上时,我将尝试一下。
Cezar 2014年

第三和第四个选项是编译器允许的唯一选项。无论是在测试4中的iOS 7崩溃,我
棕榈蓟马

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

任一import UIKitimport Foundation要求,至少与iOS 11和夫特4.
默里Sagal

但这是区分大小写的。在不区分大小写的情况下如何进行比较。像在java中的String.equalsIgnoreCase(anotherString)吗?
zulkarnain shah

@zulkarnainshah我在答案中添加了一个示例。
Murray Sagal

@MurraySagal Thats仍然不区分大小写。您正在将原始字符串转换为小写,然后将其与小写字符串进行显式比较。它将完成这项工作,但这并不是实现此目的的理想方法
zulkarnain shah

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

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


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
安德鲁Ebling

9

这是我在这个迅速的操场上第一次刺伤。我通过提供两个新函数(包含和包含IgnoreCase)来扩展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

我欢迎任何反馈:)


下一步:将其设为对所有Collection都可用的通用函数:-)例如,检出startsWith()内置函数。在“忽略大小写”变体中,仅将字符串小写一次(让lc = do.lowercaseString在执行之前)
hnh 2014年

9

在这里所有的答案中,我认为它们要么不起作用,要么有点破解(广播回NSString)。由于不同的beta版本,对此的正确答案很可能已更改。

这是我使用的:

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或者返回false作为一个布尔值,如果它不含有或以其他方式NSRange
斯特凡·卢卡

5

您不需要为此编写任何自定义代码。从1.2版本开始,Swift已经拥有您需要的所有方法:

  • 获得字符串长度:count(string);
  • 检查是否字符串包含字符串:contains(string, substring);
  • 检查字符串是否以子字符串开头: startsWith(string, substring)
  • 等等。

Swift 2不一样。
Suragch 2015年

2
Swift 2:string.hasPrefix(“开始”)
SwiftArchitect


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优胜美地(可能还有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")

字符串是您的字符串变量


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

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)方法。


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

如果您要检查一个字符串中是否包含另一个子字符串,也可以像这样检查它,

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

从文档:

Swift的String类型无缝连接到Foundation的NSString 类。如果您正在Cocoa或Cocoa Touch中使用Foundation框架,则整个NSStringString,除了本章介绍的String功能之外 API都可以调用您创建的任何 值。您还可以在需要NSString实例的任何API中使用String值。

您需要import Foundation桥接NSString方法并使它们可用于Swift的String类。


不是我,但不是,不是。
Cezar 2014年

是的 在Playground,Mac App和iOS App中尝试过。在Playground中也尝试过导入Cocoa,UIKit,Foundation以及它们三个的所有可能组合(除了Cocoa / UIKit,这没有任何意义)
Cezar

这已不再是情况下,雨燕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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.