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

Raj*_*071 504 string substring nsstring swift

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

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

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

Jen*_*rth 977

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

斯威夫特4

在Swift 4中,String是一个Character值的集合,它在Swift 2和3中不是这样的,所以你可以使用这个更简洁的代码1:

let string = "hello Swift"
if string.contains("Swift") {
    print("exists")
}
Run Code Online (Sandbox Code Playgroud)

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")
}
Run Code Online (Sandbox Code Playgroud)

年长的斯威夫特

var string = "hello Swift"

if string.rangeOfString("Swift") != nil{ 
    println("exists")
}

// alternative: not case sensitive
if string.lowercaseString.rangeOfString("swift") != nil {
    println("exists")
}
Run Code Online (Sandbox Code Playgroud)

我希望这是一个有用的解决方案,因为包括我在内的一些人通过调用遇到了一些奇怪的问题containsString().1

PS.别忘了import Foundation

脚注

  1. 请记住,在字符串上使用集合函数有一些边缘情况可以给你意想不到的结果,例如在处理表情符号或其他字形集群(如重音字母)时.

  • @TheGoonie:这不是调用`NSString`的`.rangeOfString()`.这是调用`String`的`.rangeOfString()`,它被声明为`func rangeOfString(aString:String,options mask:NSStringCompareOptions = default,range searchRange:Range <Index>?= default,locale:NSLocale?=默认) - >范围<索引>?` (19认同)
  • Apple 的文档说:`一个 NSRange 结构,给出了第一次出现 aString 在接收器中的位置和长度。如果 aString 未找到或为空 (@""),则返回 {NSNotFound, 0}。` 所以可能只是检查 `nil` 将无法正常工作。 (13认同)
  • string.lowercaseString.rangeOfString("swift").location!= NSNotFound.请阅读文档..你不会得到一个零对象. (7认同)
  • @TheGamingArt是的,你会的.Swift为你自动往返全程,所以如果NSRange是`{NSNotFound,0}`,它就代表你为零.如果它是实际范围,它将表示为Swift范围(可选).凉. (4认同)
  • 格儿.即使在Xcode 6.3.1中,containsString也不在文档中. (4认同)
  • 在C中比在Swift中更容易做到这一点.大. (2认同)

Max*_*tin 188

延伸方式

斯威夫特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
Run Code Online (Sandbox Code Playgroud)

一般来说,Swift 4 包含方法,但它可以从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 
   }
 }
Run Code Online (Sandbox Code Playgroud)

较旧的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
     }
}
Run Code Online (Sandbox Code Playgroud)

例:

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
Run Code Online (Sandbox Code Playgroud)

  • 忽略大小写使用return self.rangeOfString(find,options:NSStringCompareOptions.CaseInsensitiveSearch)!= nil (6认同)
  • 对于swift 3.0.更改为:扩展字符串{func contains(find:String) - > Bool {return self.range(of:find)!= nil} func containsIgnoringCase(find:String) - > Bool {return self.range(of:find) ,options:.caseInsensitive)!= nil}} (5认同)

Cez*_*zar 50

从文档中,似乎调用containsString()String应该工作:

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

但是,它似乎没有那样工作.

如果您尝试使用someString.containsString(anotherString),您将收到一个编译时错误'String' does not contain a member named 'containsString'.

所以,你留下了一些选项,其中一个选项是String通过使用bridgeToObjectiveC()其他两个明确地使用a 来明确地将你与Objective-C联系起来NSString,最后一个涉及将其String转换为NSString

通过桥接,你会得到:

var string = "hello Swift"
if string.bridgeToObjectiveC().containsString("Swift") {
    println("YES")
}
Run Code Online (Sandbox Code Playgroud)

通过显式键入字符串NSString,您将获得:

var string: NSString = "hello Swift"
if string.containsString("Swift") {
    println("YES")
}
Run Code Online (Sandbox Code Playgroud)

如果您有现有的String,可以使用NSString(string :)从中初始化NSString:

var string = "hello Swift"
if NSString(string: string).containsString("Swift") {
    println("YES")
}
Run Code Online (Sandbox Code Playgroud)

最后,您可以将现有投射StringNSString如下所示

var string = "hello Swift"
if (string as NSString).containsString("Swift") {
    println("YES")
}
Run Code Online (Sandbox Code Playgroud)

  • iOS 7(设备)上的最后一个例子(我没有尝试过其他的)崩溃了; Swift应用程序应该在iOS 7上运行得很好.我得到的错误是`[__ NSCFString containsString:]:无法识别的选择器发送到实例`.另外,我在dev docs中找不到方法`containsString`来确认它是否适用于iOS 8. (4认同)

Evg*_*nii 37

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

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
  }
}
Run Code Online (Sandbox Code Playgroud)

用法

MyString.contains("Niels Bohr", substring: "Bohr") // true
Run Code Online (Sandbox Code Playgroud)

iOS 9+

自iOS 9以来可用的案例和变音符号不敏感功能.

if #available(iOS 9.0, *) {
  "Für Elise".localizedStandardContains("fur") // true
}
Run Code Online (Sandbox Code Playgroud)


Mur*_*gal 31

从Xcode 7.1和Swift 2.1 containsString()开始,对我来说工作正常.

let string = "hello swift"
if string.containsString("swift") {
    print("found swift")
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特4:

let string = "hello swift"
if string.contains("swift") {
    print("found swift")
}
Run Code Online (Sandbox Code Playgroud)

一个不区分大小写的Swift 4示例:

let string = "Hello Swift"
if string.lowercased().contains("swift") {
    print("found swift")
}
Run Code Online (Sandbox Code Playgroud)

或者使用不区分大小写的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
Run Code Online (Sandbox Code Playgroud)

  • 你需要`导入基础`,否则这将无法正常工作. (3认同)

Sar*_*ith 22

在Swift 4.2中

使用

func contains(_ str: String) -> Bool
Run Code Online (Sandbox Code Playgroud)

let string = "hello Swift"
let containsSwift = string.contains("Swift")
print(containsSwift) // prints true
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这需要您导入Foundation. (4认同)

Ash*_*k R 16

>在SWIFT 3.0中

let str = "Hello Swift"
if str.lowercased().contains("Swift".lowercased()) {
    print("String Contains Another String")
} else {
    print("Not Exists")
}
Run Code Online (Sandbox Code Playgroud)

产量

String Contains Another String
Run Code Online (Sandbox Code Playgroud)


小智 15

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

let string = "hello Swift";
let subString = (string as NSString).containsString("Swift")
if(subString){println("Exist")}
Run Code Online (Sandbox Code Playgroud)


mar*_*nte 10

这是答案的附录.

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

 - (BOOL)localizedCaseInsensitiveContainsString:(NSString *)aString
Run Code Online (Sandbox Code Playgroud)

例:

    import Foundation

    var string: NSString  =  "hello Swift"
   if string.localizedCaseInsensitiveContainsString("Hello") {
    println("TRUE")
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

这是iOS和Mac OS X 10.10.x的Foundation Framework的 一部分,并且是我原始发布时间的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;


man*_*lds 9

你可以按照你提到的去做:

\n\n
import Foundation\n...\nstring.contains("Swift");\n
Run Code Online (Sandbox Code Playgroud)\n\n

来自文档:

\n\n
\n

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

\n
\n\n

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

\n


小智 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
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它

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
Run Code Online (Sandbox Code Playgroud)

我欢迎任何反馈:)


use*_*430 9

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

这是我使用的:

let string: String = "hello Swift"
if string.rangeOfString("Swift") != nil
{
    println("exists")
}
Run Code Online (Sandbox Code Playgroud)

Beta 5需要"!= nil".


小智 7

Swift 5,不区分大小写:

if string.localizedLowercase.contains("swift".localizedLowercase){
    // your code here
}
Run Code Online (Sandbox Code Playgroud)


Sté*_*uca 6

这个给你:

let s = "hello Swift"
if let textRange = s.rangeOfString("Swift") {
    NSLog("exists")
}
Run Code Online (Sandbox Code Playgroud)


Max*_*ich 5

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

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

  • **Swift 2**:string.hasPrefix("start") (2认同)

Mar*_*ida 5

在Swift 3中

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