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

时间:2014-06-04 09:43:33

标签: swift string nsstring substring

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

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

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

27 个答案:

答案 0 :(得分:913)

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

Swift 4&斯威夫特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. 请记住,在字符串上使用集合函数有一些edge cases可以给你带来意想不到的结果,例如: G。处理表情符号或其他字形集群时,如重音字母。

答案 1 :(得分:185)

扩展方式

Swift 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方法,但可以从iOS 8.0 +

获得

Swift 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

答案 2 :(得分:49)

从文档中,似乎在String上调用containsString()应该有效:

  

Swift的String类型与Foundation的NSString无缝桥接   类。如果您正在使用Cocoa中的Foundation框架   Cocoa Touch,整个NSString API可以调用任何   除了描述的String功能外,您创建的字符串值   在这一章当中。您还可以将String值与任何API一起使用   需要一个NSString实例。

然而,它似乎并没有这样做。

如果您尝试使用someString.containsString(anotherString),则会出现编译时错误,指出'String' does not contain a member named 'containsString'

因此,您选择了一些选项,其中一个选项是使用String明确地将bridgeToObjectiveC()与Objective-C联系起来,其他两个选项明确使用{{1}最后一个涉及将NSString转换为String

通过桥接,你得到:

NSString

通过明确地将字符串键入var string = "hello Swift" if string.bridgeToObjectiveC().containsString("Swift") { println("YES") } ,您将获得:

NSString

如果您有一个var string: NSString = "hello Swift" if string.containsString("Swift") { println("YES") } ,可以使用NSString(string :)来初始化NSString:

String

最后,您可以将现有var string = "hello Swift" if NSString(string: string).containsString("Swift") { println("YES") } 转换为String,如下所示

NSString

答案 3 :(得分:36)

另一个。支持案例和变音符选项。

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
}

答案 4 :(得分: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

答案 5 :(得分:22)

在Swift 4.2中

使用

func contains(_ str: String) -> Bool

实施例

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

答案 6 :(得分:16)

<强>&GT;在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

答案 7 :(得分:15)

您可以使用代码在Swift中轻松完成此操作:

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

答案 8 :(得分:9)

这是我在快速操场上的第一次尝试。 我通过提供两个新函数(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

我欢迎任何反馈:)

答案 9 :(得分:9)

这里只是答案的附录。

您还可以使用以下方法进行本地不区分大小写的测试:

 - (BOOL)localizedCaseInsensitiveContainsString:(NSString *)aString

示例:

    import Foundation

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

<强>更新

这是iOS及其基础框架的一部分。 Mac OS X 10.10.x  并且是我原始发布时间的10.10的一部分。

  

生成的文档:2014-06-05 12:26:27 -0700 OS X发行说明   版权所有©2014 Apple Inc.保留所有权利。

     

OS X 10.10 Release Notes可可基金会框架

     

NSString现在有以下两种便捷方法:

     

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

     

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

答案 10 :(得分:9)

在这里的所有答案中,我认为他们要么不工作,要么他们有点黑客(回到NSString)。对于不同的测试版本,很可能对此的正确答案已经改变。

以下是我使用的内容:

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

&#34;!= nil&#34; Beta 5需要。

答案 11 :(得分:6)

你在这里:

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

答案 12 :(得分:5)

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

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

答案 13 :(得分:5)

在Swift 3中

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

答案 14 :(得分:4)

你走了!准备好Xcode 8和Swift 3。

{{1}}

答案 15 :(得分:3)

string.containsString仅在10.10 Yosemite(可能是iOS8)中可用。 同样将其与10.9中的ObjectiveC崩溃联系起来。您正在尝试将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上开发是超级稳定的。我不使用游乐场或操场的命令行版本。我发现如果导入了正确的框架,自动完成功能非常有用。

答案 16 :(得分: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

答案 17 :(得分:2)

检查它是否包含'Hello'

let s = "Hello World"

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

答案 18 :(得分:2)

快速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's answer,这是完全正确的。我不知道为什么这么多的答案要花费这么多的麻烦来重新创建Foundation的{​​{1}}方法。

答案 19 :(得分: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.
}

答案 20 :(得分:1)

借助Swift 4中的新语法,您可以

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

string是您的字符串变量

答案 21 :(得分: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进行了更改后,我可以参考   跟随字符串比较例程(设置为惰性变量)   返回布尔)。这允许人们随时检查状态。

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

答案 22 :(得分:0)

在iOS 8及更高版本中,您可以使用以下两种NSString方法:

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

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

答案 23 :(得分:0)

Swift 3:在这里,您可以看到我的智能搜索扩展名字符串,可让您搜索字符串以查看其是否包含,或者可能根据搜索文本过滤集合。< / p>

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

答案 24 :(得分:0)

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

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

现在,在这个特定的字符串中,如果您想知道它是否包含水果名称“苹果”,就可以这样做

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

希望这对您有用。

答案 25 :(得分:-2)

你可以做你刚才提到的事情:

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

来自文档:

  

Swift的String类型与Foundation NSString无缝连接   类。如果您正在使用Cocoa中的Foundation框架   Cocoa Touch,整个NSString API可用于调用任何API   除了描述的字符串功能外,您创建的String值   在这一章当中。您还可以将String值与任何API一起使用   需要一个NSString实例。

您需要import Foundation来桥接NSString方法,并将它们提供给Swift的String类。

答案 26 :(得分:-4)

SWIFT 4非常简单!

NavLink