在 Swift 中将字符串拆分为数组?

Split a String into an array in Swift?

提问人:blee908 提问时间:9/5/2014 最后编辑:user16217248blee908 更新时间:10/13/2023 访问量:779904

问:

假设我这里有一个字符串:

var fullName: String = "First Last"

我想在空格的基础上拆分字符串,并将值分配给它们各自的变量

var fullNameArr = // something like: fullName.explode(" ") 

var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]

此外,有时用户可能没有姓氏。

数组 swift 字符串 拆分

评论

16赞 David Gölzhäuser 9/5/2014
嗨,我没有要检查的 Mac。但是你可以试试'fullName.componentsSeparatedByString(string:“ ”)'不要复制粘贴,使用autocomplete函数,这样你就可以得到正确的函数。
0赞 Jojodmo 12/25/2015
如果只拆分一个字符,则使用 也可以(替换为 UTF-16)。例如,可以使用以下命令进行拆分fullName.utf8.split( <utf-8 character code> ).utf8.utf16+fullName.utf8.split(43)
0赞 Berry 7/28/2017
此外,有时姓氏中带有空格,例如“Daphne du Maurier”或“Charles de Lint”
0赞 prosti 1/31/2020
我发现这很好:通过单个分隔符拆分字符串,通过多个分隔符拆分字符串,按单词分隔符拆分字符串

答:

212赞 Wyetro 9/5/2014 #1

执行此操作的最简单方法是使用 componentsSeparatedBy:

对于 Swift 2:

import Foundation
let fullName : String = "First Last";
let fullNameArr : [String] = fullName.componentsSeparatedByString(" ")

// And then to access the individual words:

var firstName : String = fullNameArr[0]
var lastName : String = fullNameArr[1]

对于 Swift 3:

import Foundation

let fullName : String = "First Last"
let fullNameArr : [String] = fullName.components(separatedBy: " ")

// And then to access the individual words:

var firstName : String = fullNameArr[0]
var lastName : String = fullNameArr[1]

评论

0赞 NRitH 2/18/2015
这在任何地方都有记录吗,莫里?如果我需要拆分单个字符以外的内容怎么办?
13赞 rmp251 5/14/2015
@NRitH考虑.componentsSeparatedByCharactersInSet(.whitespaceAndNewlineCharacterSet())
0赞 rmp251 7/17/2015
@Crashalot有两个函数:componentsSeparatedByStringcomponentsSeparatedByCharactersInSet
0赞 Wyetro 7/24/2020
@MdRais你应该问一个新问题,这个问题已经有 6 年的历史了
1194赞 Chen-Tsu Lin 9/5/2014 #2

只需在您的componentsSeparatedByStringfullName

import Foundation

var fullName: String = "First Last"
let fullNameArr = fullName.componentsSeparatedByString(" ")

var firstName: String = fullNameArr[0]
var lastName: String = fullNameArr[1]

Swift 3+ 更新

import Foundation

let fullName    = "First Last"
let fullNameArr = fullName.components(separatedBy: " ")

let name    = fullNameArr[0]
let surname = fullNameArr[1]

评论

4赞 Can 5/31/2015
请注意,这实际上是一个底层(Swift 在导入时会自动交换它们)。NSStringFoundation
2赞 elcuco 6/17/2015
在 Swift 1.2 中不再如此,Apple 不再自动将 Swift 的字符串转换为 NSString。
8赞 Andrew 7/22/2015
这个答案适用于 Xcode 7 beta 4 和 Swift 2.0。Xcode 现在可以自动完成 Swift String 对象上的 Foundation 方法,而无需将类型转换为 NSString,这在 Xcode 6.4 和 Swift 1.2 中并非如此。
1赞 Velizar Hristov 10/6/2015
在我导入 Foundation 之前,它在 REPL 中不起作用。
1赞 Jon Cox 1/27/2016
这在 Xcode 7.2 中完全符合预期(即 fullNameArr 是 )。[String]
58赞 Antonio 9/5/2014 #3

作为 WMios 答案的替代方案,您还可以使用 ,这在您有更多分隔符(空格、逗号等)的情况下会很方便。componentsSeparatedByCharactersInSet

根据您的具体输入:

let separators = NSCharacterSet(charactersInString: " ")
var fullName: String = "First Last";
var words = fullName.componentsSeparatedByCharactersInSet(separators)

// words contains ["First", "Last"]

使用多个分隔符:

let separators = NSCharacterSet(charactersInString: " ,")
var fullName: String = "Last, First Middle";
var words = fullName.componentsSeparatedByCharactersInSet(separators)

// words contains ["Last", "First", "Middle"]

评论

3赞 Chris 6/4/2015
在我看来,最有用的答案,因为您可能希望允许使用 或 或任何其他分隔符分隔字符串,;
0赞 Antonio 7/24/2020
@MdRais可用于访问字符串中的单个字符 - 请注意,每个元素都是for:inCharacter
0赞 Sam 3/21/2023
这应该是公认的答案。接受的答案不按空格拆分,仅按空格字符拆分。
830赞 Ethan 10/9/2014 #4

Swift 的方法是使用全局函数,如下所示:split

var fullName = "First Last"
var fullNameArr = split(fullName) {$0 == " "}
var firstName: String = fullNameArr[0]
var lastName: String? = fullNameArr.count > 1 ? fullNameArr[1] : nil

使用 Swift 2

在 Swift 2 中,由于引入了内部 CharacterView 类型,split 的使用变得更加复杂。这意味着 String 不再采用 SequenceType 或 CollectionType 协议,您必须改用该属性来访问 String 实例的 CharacterView 类型表示形式。(注意:CharacterView 确实采用 SequenceType 和 CollectionType 协议)。.characters

let fullName = "First Last"
let fullNameArr = fullName.characters.split{$0 == " "}.map(String.init)
// or simply:
// let fullNameArr = fullName.characters.split{" "}.map(String.init)

fullNameArr[0] // First
fullNameArr[1] // Last 

评论

104赞 Casey Perkins 11/25/2014
在我的测试中,componentsSeparatedByString 通常要快得多,尤其是在处理需要拆分成许多部分的字符串时。但对于OP列出的示例,任何一个都应该足够了。
10赞 Pascal 1/7/2015
从 Xcode 6.2b3 开始,split 可以用作 .split("a:b::c:", {$0 == ":"}, maxSplit: Int.max, allowEmptySlices: false)
15赞 NRitH 2/18/2015
请记住,如果您的分隔符长度超过单个字符,您仍然需要使用旧方法。尽管说起来很酷,但可悲的是,这行不通。componentsSeparatedByString()let (firstName, lastName) = split(fullName) {$0 == ' '}
3赞 Ethan 5/20/2015
@Kashif那么你可以使用 或split("a,b;c,d") {$0 == "," || $0 == ";"}split("a,b;c,d") {contains(",;", $0)}
4赞 skagedal 9/23/2015
Xcode 7.0 的正确代码是 let fullNameArr = fullName.characters.split{$0 == “ ”}.map(String.init)。尝试编辑,但被拒绝了。
71赞 Leo Dabus 1/10/2015 #5

Swift 4 或更高版本

如果只需要正确设置人名的格式,则可以使用 PersonNameComponentsFormatter

PersonNameComponentsFormatter 类提供本地化 表示人名的组成部分,如所表示 由 PersonNameComponents 对象提供。使用此类创建本地化 向用户显示人名信息时的姓名。


// iOS (9.0 and later), macOS (10.11 and later), tvOS (9.0 and later), watchOS (2.0 and later)
let nameFormatter = PersonNameComponentsFormatter()

let name =  "Mr. Steven Paul Jobs Jr."
// personNameComponents requires iOS (10.0 and later)
if let nameComps  = nameFormatter.personNameComponents(from: name) {
    nameComps.namePrefix   // Mr.
    nameComps.givenName    // Steven
    nameComps.middleName   // Paul
    nameComps.familyName   // Jobs
    nameComps.nameSuffix   // Jr.

    // It can also be configured to format your names
    // Default (same as medium), short, long or abbreviated

    nameFormatter.style = .default
    nameFormatter.string(from: nameComps)   // "Steven Jobs"

    nameFormatter.style = .short
    nameFormatter.string(from: nameComps)   // "Steven"

    nameFormatter.style = .long
    nameFormatter.string(from: nameComps)   // "Mr. Steven Paul Jobs jr."

    nameFormatter.style = .abbreviated
    nameFormatter.string(from: nameComps)   // SJ

    // It can also be use to return an attributed string using annotatedString method
    nameFormatter.style = .long
    nameFormatter.annotatedString(from: nameComps)   // "Mr. Steven Paul Jobs jr."
}

enter image description here

编辑/更新:

Swift 5 或更高版本

对于仅按非字母字符拆分字符串,我们可以使用新的 Character 属性 isLetter

let fullName = "First Last"

let components = fullName.split{ !$0.isLetter }
print(components)  // "["First", "Last"]\n"

评论

4赞 Leo Dabus 7/18/2019
@DarrellRoot您只需要映射子字符串fullName.split { $0.isWhitespace }.map(String.init)
2赞 Darrell Root 7/18/2019
我喜欢这个新 API,但请记住它返回子字符串。我需要字符串(并且通常想在空格上拆分),所以我这样做了:感谢@LeoDabus的版本(我的原始评论缺少代码)。另外,我建议将 Swift 5 版本移到答案的顶部。let words = line.split{ $0.isWhitespace }.map{ String($0)}
9赞 Sruit A.Suk 3/12/2015 #6

我发现了一个有趣的案例,那就是

方法 1

var data:[String] = split( featureData ) { $0 == "\u{003B}" }

当我使用此命令从从服务器加载的数据中拆分某些符号时,它可以在模拟器中测试时拆分并与测试设备同步,但不会在发布应用程序和 Ad Hoc 中拆分

我花了很多时间来跟踪这个错误,它可能会从某些 Swift 版本或某些 iOS 版本或两者都不是

这也与 HTML 代码无关,因为我尝试 stringByRemovingPercentEncoding 但它仍然不起作用

添加 10/10/2015

在 Swift 2.0 中,此方法已更改为

var data:[String] = featureData.split {$0 == "\u{003B}"}

方法 2

var data:[String] = featureData.componentsSeparatedByString("\u{003B}")

当我使用此命令时,它可以正确拆分从服务器加载的相同数据


结论,我真的建议使用方法2

string.componentsSeparatedByString("")

评论

1赞 rickster 7/30/2015
我想说这接近于“不是答案”的状态,因为它主要是对现有答案的评论。但它指出了一些重要的事情。
3赞 Daniel H. 8/8/2015 #7

这在 Beta 5 中再次发生了变化。呜呜!它现在是 CollectionType 上的一个方法

老:

var fullName = "First Last"
var fullNameArr = split(fullName) {$0 == " "}

新增功能:

var fullName = "First Last"
var fullNameArr = fullName.split {$0 == " "}

Apple 发行说明

8赞 Rauli Rikama 9/11/2015 #8

或者,如果没有闭包,你可以在 Swift 2 中做到这一点:

let fullName = "First Last"
let fullNameArr = fullName.characters.split(" ")
let firstName = String(fullNameArr[0])

评论

0赞 Brett 6/4/2023
这在 Swift5 中仍然有效,并修复了 components(seperatedBy: “ ”) 具有的双倍空格问题。
1赞 abinop 10/1/2015 #9

对于 swift 2,XCode 7.1:

let complete_string:String = "Hello world"
let string_arr =  complete_string.characters.split {$0 == " "}.map(String.init)
let hello:String = string_arr[0]
let world:String = string_arr[1]
40赞 Cameron Lowell Palmer 1/2/2016 #10

空白问题

一般来说,人们一遍又一遍地重新发明这个问题和糟糕的解决方案。这是一个空间吗?“ ”还有“\n”、“\t”或一些你从未见过的 unicode 空格字符呢,很大程度上是因为它是不可见的。虽然你可以侥幸逃脱

一个薄弱的解决方案

import Foundation
let pieces = "Mary had little lamb".componentsSeparatedByString(" ")

如果您需要摆脱对现实的控制,请观看有关字符串或日期的 WWDC 视频。简而言之,让苹果解决这种平凡的任务几乎总是更好。

可靠的解决方案:使用 NSCharacterSet

恕我直言,正确执行此操作的方法是使用,因为如前所述,您的空格可能不是您期望的,并且 Apple 提供了一个空格字符集。要探索提供的各种字符集,请查看 Apple 的 NSCharacterSet 开发人员文档,然后,只有在它不符合您的需求时,才能扩充或构造新的字符集。NSCharacterSet

NSCharacterSet 空格

返回包含 Unicode 常规字符的字符集 Z 类和字符表(U+0009)。

let longerString: String = "This is a test of the character set splitting system"
let components = longerString.components(separatedBy: .whitespaces)
print(components)

评论

2赞 Nicolas Miari 7/1/2016
同意。在看到被“ ”分割的答案后,我首先想到的是:如果输入文本包含几个连续的空格会发生什么?如果它有标签怎么办?全角 (CJK) 空间?等。
2赞 Amr Lotfy 4/7/2016 #11
let str = "one two"
let strSplit = str.characters.split(" ").map(String.init) // returns ["one", "two"]

Xcode 7.2 (7C68) (英语)

0赞 Gautam Sareriya 4/26/2016 #12

根据 Swift 2.2

您只需编写 2 行代码,即可获得拆分字符串。

let fullName = "FirstName LastName"
var splitedFullName = fullName.componentsSeparatedByString(" ")
print(splitedFullName[0])
print(splitedFullName[1]) 

享受。:)

评论

2赞 Eric Aya 4/26/2016
与本页 stackoverflow.com/a/25678505/2227743 的答案相同。在发布您的答案之前,请阅读其他答案。谢谢。
1赞 DevAndArtist 5/10/2016 #13

这是我刚刚构建的一个算法,它将从数组中除以任何,如果希望保留带有拆分字符的子字符串,可以将参数设置为 。StringCharacterswallowtrue

Xcode 7.3 - Swift 2.2:

extension String {

    func splitBy(characters: [Character], swallow: Bool = false) -> [String] {

        var substring = ""
        var array = [String]()
        var index = 0

        for character in self.characters {

            if let lastCharacter = substring.characters.last {

                // swallow same characters
                if lastCharacter == character {

                    substring.append(character)

                } else {

                    var shouldSplit = false

                    // check if we need to split already
                    for splitCharacter in characters {
                        // slit if the last character is from split characters or the current one
                        if character == splitCharacter || lastCharacter == splitCharacter {

                            shouldSplit = true
                            break
                        }
                    }

                    if shouldSplit {

                        array.append(substring)
                        substring = String(character)

                    } else /* swallow characters that do not equal any of the split characters */ {

                        substring.append(character)
                    }
                }
            } else /* should be the first iteration */ {

                substring.append(character)
            }

            index += 1

            // add last substring to the array
            if index == self.characters.count {

                array.append(substring)
            }
        }

        return array.filter {

            if swallow {

                return true

            } else {

                for splitCharacter in characters {

                    if $0.characters.contains(splitCharacter) {

                        return false
                    }
                }
                return true
            }
        }
    }
}

例:

"test text".splitBy([" "]) // ["test", "text"]
"test++text--".splitBy(["+", "-"], swallow: true) // ["test", "++" "text", "--"]
2赞 Aqib Mumtaz 6/2/2016 #14

Swift 2.2 错误处理和 capitalizedString 添加:

func setFullName(fullName: String) {
    var fullNameComponents = fullName.componentsSeparatedByString(" ")

    self.fname = fullNameComponents.count > 0 ? fullNameComponents[0]: ""
    self.sname = fullNameComponents.count > 1 ? fullNameComponents[1]: ""

    self.fname = self.fname!.capitalizedString
    self.sname = self.sname!.capitalizedString
}
11赞 uɥƃnɐʌuop 6/21/2016 #15

这些答案中的大多数都假设输入包含一个空格 - 而不是空格,并且只有一个格。如果你能安全地做出这个假设,那么公认的答案(来自贝内特)是相当优雅的,也是我尽可能采用的方法。

当我们无法做出这种假设时,一个更强大的解决方案需要涵盖以下大多数答案没有考虑的参数:

  • 制表符/换行符/空格(空格),包括重复出现的字符
  • 前导/尾随空格
  • Apple/Linux () Windows () 换行符\n\r\n

为了涵盖这些情况,此解决方案使用正则表达式将所有空格(包括重复字符和 Windows 换行符)转换为单个空格,修剪,然后按单个空格拆分:

斯威夫特 3:

let searchInput = "  First \r\n \n \t\t\tMiddle    Last "
let searchTerms = searchInput 
    .replacingOccurrences(
        of: "\\s+",
        with: " ",
        options: .regularExpression
    )
    .trimmingCharacters(in: .whitespaces)
    .components(separatedBy: " ")

// searchTerms == ["First", "Middle", "Last"]
14赞 NikaE 11/5/2016 #16

Xcode 8.0 / 斯威夫特 3

let fullName = "First Last"
var fullNameArr = fullName.components(separatedBy: " ")

var firstname = fullNameArr[0] // First
var lastname = fullNameArr[1] // Last

路漫漫其修远兮:

var fullName: String = "First Last"
fullName += " " // this will help to see the last word

var newElement = "" //Empty String
var fullNameArr = [String]() //Empty Array

for Character in fullName.characters {
    if Character == " " {
        fullNameArr.append(newElement)
        newElement = ""
    } else {
        newElement += "\(Character)"
    }
}


var firsName = fullNameArr[0] // First
var lastName = fullNameArr[1] // Last

评论

1赞 NikaE 7/24/2020
@MdRais let name = “JOHN” print(Array(name))
162赞 LugiHaue 11/22/2016 #17

Swift Dev. 4.0(2017 年 5 月 24 日)

Swift 4 (Beta) 中的新功能。split

import Foundation
let sayHello = "Hello Swift 4 2017";
let result = sayHello.split(separator: " ")
print(result)

输出:

["Hello", "Swift", "4", "2017"]

访问值:

print(result[0]) // Hello
print(result[1]) // Swift
print(result[2]) // 4
print(result[3]) // 2017

Xcode 8.1 / Swift 3.0.1 的

这是多个分隔符与数组的方式。

import Foundation
let mathString: String = "12-37*2/5"
let numbers = mathString.components(separatedBy: ["-", "*", "/"])
print(numbers)

输出:

["12", "37", "2", "5"]

评论

9赞 Adrian 2/7/2017
确保添加到您正在使用它的类中。#SavedYouFiveMinutesimport Foundation
4赞 OderWat 8/22/2017
注意(Swift 4):如果你有一个字符串 like 并且你使用,你会得到一个数组 like。这可以使用默认情况下为 true 的值进行更改。let a="a,,b,c"a.split(separator: ",")["a", "b", c"]omittingEmptySubsequences: false
2赞 pkamb 9/7/2018
Swift 4+ 中是否有多字符拆分?
10赞 CodeBender 1/8/2017 #18

我有一个场景,即我想要拆分的字符串中可以存在多个控制字符。我没有维护这些数组,而是让 Apple 处理这部分。

以下内容适用于 iOS 10 上的 Swift 3.0.1:

let myArray = myString.components(separatedBy: .controlCharacters)
3赞 possen 4/14/2017 #19

字符串处理在 Swift 中仍然是一个挑战,而且它一直在发生重大变化,正如你从其他答案中看到的那样。希望事情能安定下来,事情会变得更简单。这是使用当前具有多个分隔符的 Swift 3.0 版本的方法。

斯威夫特 3:

let chars = CharacterSet(charactersIn: ".,; -")
let split = phrase.components(separatedBy: chars)

// Or if the enums do what you want, these are preferred. 
let chars2 = CharacterSet.alphaNumerics // .whitespaces, .punctuation, .capitalizedLetters etc
let split2 = phrase.components(separatedBy: chars2)
23赞 Jeroen Zonneveld 6/8/2017 #20

Swift 4 使拆分字符变得更加容易,只需对字符串使用新的拆分函数即可。

例: let s = "hi, hello" let a = s.split(separator: ",") print(a)

现在你得到了一个带有 'hi' 和 'hello' 的数组。

评论

0赞 Lirik 2/21/2019
请注意,这不会返回 String 数组,而是返回 Substring 数组,这使用起来很笨拙。
51赞 Bobby 6/13/2017 #21

斯威夫特 4

let words = "these words will be elements in an array".components(separatedBy: " ")

评论

0赞 Bobby 7/24/2020
尝试将单词转换为 char 数据类型。
0赞 Vadim Bulavin 7/12/2017 #22

我还没有找到可以处理具有 3 个或更多组件的名称并支持较旧的 iOS 版本的解决方案。

struct NameComponentsSplitter {

    static func split(fullName: String) -> (String?, String?) {
        guard !fullName.isEmpty else {
            return (nil, nil)
        }
        let components = fullName.components(separatedBy: .whitespacesAndNewlines)
        let lastName = components.last
        let firstName = components.dropLast().joined(separator: " ")
        return (firstName.isEmpty ? nil : firstName, lastName)
    }
}

通过的测试用例:

func testThatItHandlesTwoComponents() {
    let (firstName, lastName) = NameComponentsSplitter.split(fullName: "John Smith")
    XCTAssertEqual(firstName, "John")
    XCTAssertEqual(lastName, "Smith")
}

func testThatItHandlesMoreThanTwoComponents() {
    var (firstName, lastName) = NameComponentsSplitter.split(fullName: "John Clark Smith")
    XCTAssertEqual(firstName, "John Clark")
    XCTAssertEqual(lastName, "Smith")

    (firstName, lastName) = NameComponentsSplitter.split(fullName: "John Clark Jr. Smith")
    XCTAssertEqual(firstName, "John Clark Jr.")
    XCTAssertEqual(lastName, "Smith")
}

func testThatItHandlesEmptyInput() {
    let (firstName, lastName) = NameComponentsSplitter.split(fullName: "")
    XCTAssertEqual(firstName, nil)
    XCTAssertEqual(lastName, nil)
}
0赞 Sai kumar Reddy 7/28/2017 #23
let fullName : String = "Steve.Jobs"
let fullNameArr : [String] = fullName.components(separatedBy: ".")

var firstName : String = fullNameArr[0]
var lastName : String = fullNameArr[1]

评论

1赞 joanolo 7/28/2017
关于为什么这会产生预期结果的一些解释会有所帮助。
0赞 Kundan 7/29/2017
请给出一些解释,这样做总是更好。
0赞 help-info.de 7/29/2017
从审核队列:请允许我请求您围绕您的回答添加更多背景信息。只有代码的答案很难理解。如果您可以在帖子中添加更多信息,这将对提问者和未来的读者有所帮助。另请参阅解释完全基于代码的答案
0赞 Sai kumar Reddy 12/23/2019
这里 fullName 是一个用 “.” 分隔的字符串,使用 fullName.components(separatedBy: “.”) 默认 Apple 提供的函数,它返回一个字符串数组
21赞 tepl 9/17/2017 #24

斯威夫特 3

let line = "AAA    BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
  • 返回三个字符串,并且AAABBBCCC
  • 筛选出空字段
  • 处理多个空格和制表字符
  • 如果要处理新行,请替换为.whitespaces.whitespacesAndNewlines
0赞 jnblanchard 4/10/2018 #25
var fullName = "James Keagan Michael"
let first = fullName.components(separatedBy: " ").first?.isEmpty == false ? fullName.components(separatedBy: " ").first! : "John"
let last =  fullName.components(separatedBy: " ").last?.isEmpty == false && fullName.components(separatedBy: " ").last != fullName.components(separatedBy: " ").first ? fullName.components(separatedBy: " ").last! : "Doe"
  • 禁止相同的名字和姓氏
  • 如果全名无效,则采用占位符值“John Doe”
9赞 Vidhyapathi Kandhasamy 5/2/2018 #26

在 Swift 4 中将字符串拆分为数组的步骤。

  1. 分配字符串
  2. 基于 @ 拆分。

注意:variableName.components(separatedBy: “split keyword”)

let fullName: String = "First Last @ triggerd event of the session by session storage @ it can be divided by the event of the trigger."
let fullNameArr = fullName.components(separatedBy: "@")
print("split", fullNameArr)
4赞 Parth Barot 5/2/2018 #27

假设你有一个名为“Hello World”的变量,如果你想拆分它并将其存储为两个不同的变量,你可以这样使用:

var fullText = "Hello World"
let firstWord = fullText.text?.components(separatedBy: " ").first
let lastWord = fullText.text?.components(separatedBy: " ").last
6赞 Benjamin RD 7/31/2018 #28

斯威夫特 4

let string = "loremipsum.dolorsant.amet:"

let result = string.components(separatedBy: ".")

print(result[0])
print(result[1])
print(result[2])
print("total: \(result.count)")

输出

loremipsum
dolorsant
amet:
total: 3
18赞 Xcodian Solangi 8/3/2018 #29

Swift 4、Xcode 10 和 iOS 12 更新 100% 工作

let fullName = "First Last"    
let fullNameArr = fullName.components(separatedBy: " ")
let firstName = fullNameArr[0] //First
let lastName = fullNameArr[1] //Last

有关详细信息,请参阅此处的 Apple 文档

3赞 AamirR 8/18/2018 #30

我一直在寻找松散的拆分,例如 PHP 的,其中空序列包含在生成的数组中,这对我有用:explode

"First ".split(separator: " ", maxSplits: 1, omittingEmptySubsequences: false)

输出:

["First", ""]
38赞 Naresh 9/17/2018 #31

Swift 4.2 和 Xcode 10

//This is your str
let str = "This is my String" //Here replace with your string

选项 1

let items = str.components(separatedBy: " ")//Here replase space with your value and the result is Array.
//Direct single line of code
//let items = "This is my String".components(separatedBy: " ")
let str1 = items[0]
let str2 = items[1]
let str3 = items[2]
let str4 = items[3]
//OutPut
print(items.count)
print(str1)
print(str2)
print(str3)
print(str4)
print(items.first!)
print(items.last!)

选项 2

let items = str.split(separator: " ")
let str1 = String(items.first!)
let str2 = String(items.last!)
//Output
print(items.count)
print(items)
print(str1)
print(str2)

选项 3

let arr = str.split {$0 == " "}
print(arr)

选项 4

let line = "BLANCHE:   I don't want realism. I want magic!"
print(line.split(separator: " "))
// Prints "["BLANCHE:", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"

由 Apple 文档....

let line = "BLANCHE:   I don't want realism. I want magic!"
print(line.split(separator: " "))
// Prints "["BLANCHE:", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"

print(line.split(separator: " ", maxSplits: 1))//This can split your string into 2 parts
// Prints "["BLANCHE:", "  I don\'t want realism. I want magic!"]"

print(line.split(separator: " ", maxSplits: 2))//This can split your string into 3 parts

print(line.split(separator: " ", omittingEmptySubsequences: false))//array contains empty strings where spaces were repeated.
// Prints "["BLANCHE:", "", "", "I", "don\'t", "want", "realism.", "I", "want", "magic!"]"

print(line.split(separator: " ", omittingEmptySubsequences: true))//array not contains empty strings where spaces were repeated.
print(line.split(separator: " ", maxSplits: 4, omittingEmptySubsequences: false))
print(line.split(separator: " ", maxSplits: 3, omittingEmptySubsequences: true))
-2赞 blackstorm 12/3/2018 #32

您可以使用此通用函数并添加要分隔的任何字符串

func separateByString(String wholeString: String, byChar char:String) -> [String] {

    let resultArray = wholeString.components(separatedBy: char)
    return resultArray
}

var fullName: String = "First Last"
let array = separateByString(String: fullName, byChar: " ")
var firstName: String = array[0]
var lastName: String = array[1]
print(firstName)
print(lastName)

评论

0赞 Eric Aya 12/4/2018
你好。在 Swift 中,参数 name 应始终以小写开头。喜欢:。此外,这种方式可以避免将变量名称与类型混为一谈。separateByString(string wholeString: String, byChar char:String)
-2赞 Mohammed Abunada 12/6/2018 #33

这是用于 swift 4.2 的字符串和 CSV 文件,20181206 1610

var dataArray : [[String]] = []
 let path = Bundle.main.path(forResource: "csvfilename", ofType: "csv")
        let url = URL(fileURLWithPath: path!)
        do {
            let data = try Data(contentsOf: url) 
            let content = String(data: data, encoding: .utf8)
            let parsedCSV = content?.components(separatedBy: "\r\n").map{ $0.components(separatedBy: ";") }
           for line in parsedCSV!
            {
                dataArray.append(line)
           }
        }
        catch let jsonErr {
            print("\n   Error read CSV file: \n ", jsonErr)
        }

            print("\n MohNada 20181206 1610 - The final result is \(dataArray)  \n ")
83赞 Mithra Singam 7/8/2019 #34

Swift 5.2 的更新和最简单的方式

let paragraph = "Bob hit a ball, the hit BALL flew far after it was hit. Hello! Hie, How r u?"

let words = paragraph.components(separatedBy: [",", " ", "!",".","?"])

这打印,

[“鲍勃”, “命中”, “一个”, “球”, “”, “的”, “命中”, “球”, “飞”, “远”, “之后”, “它”, “曾经”, “命中”, “”, “你好”, “”, “嗨”, “”, “如何”, “r”, “u”, “”]

但是,如果要过滤掉空字符串,

let words = paragraph.components(separatedBy: [",", " ", "!",".","?"]).filter({!$0.isEmpty})

输出

[“鲍勃”, “命中”, “一个”, “球”, “的”, “命中”, “球”, “飞”, “远”, “之后”, “它”, “曾经”, “命中”, “你好”, “嗨”, “如何”, “r”, “u”]

但请确保 Foundation 是导入的。

评论

0赞 Nikolay Suvandzhiev 2/10/2021
请注意,在某些极端情况下,这具有不同的行为。例如:with 将产生两个元素,而 with 将产生三个元素,第一个是空字符串。"/users/4"splitcomponents
9赞 YodagamaHeshan 2/18/2020 #35

直接给出了拆分部件的数组

var fullNameArr = fullName.components(separatedBy:" ")

那么你可以这样使用,

var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]
26赞 mistdon 3/18/2020 #36

只有 是正确答案,这里是 2 个以上空格的区别。split

斯威夫特 5

var temp = "Hello world     ni hao"
let arr  = temp.components(separatedBy: .whitespacesAndNewlines)
// ["Hello", "world", "", "", "", "", "ni", "hao"]
let arr2 = temp.components(separatedBy: " ")
// ["Hello", "world", "", "", "", "", "ni", "hao"]
let arr3 = temp.split(whereSeparator: {$0 == " "})
// ["Hello", "world", "ni", "hao"]
0赞 0-1 8/7/2020 #37

根据 Don Vaughn 的回答,我喜欢正则表达式的使用。我很惊讶这只是第二个正则表达式答案。但是,如果我们能用一种方法而不是多种方法解决这个问题,那就太好了。split

我还受到 Mithra Singam 的 Answer 的启发,排除了所有标点符号和空格。但是,必须创建一个不允许的字符列表并没有引起我的共鸣。

  • \w- 字母或数字符号的正则表达式。没有标点符号。
let foo = "(..#   Hello,,(---- World   ".split {
    String($0).range(of: #"\w"#, options: .regularExpression) == nil
}
print(foo) // Prints "Hello World"

假设你对所有Unicode都不满意。只使用ASKII字母和数字怎么样?

let bar = "(..#   Hello,,(---- World   ".split {
    !($0.isASCII && ($0.isLetter || $0.isNumber))
}
print(bar) // Prints "Hello World"
2赞 Alexander Volkov 5/1/2021 #38

OFFTOP:

对于搜索如何用子字符串(而不是字符)拆分字符串的人,那么这里是有效的解决方案:

// TESTING
let str1 = "Hello user! What user's details? Here user rounded with space."
let a = str1.split(withSubstring: "user") // <-------------- HERE IS A SPLIT
print(a) // ["Hello ", "! What ", "\'s details? Here ", " rounded with space."]

// testing the result
var result = ""
for item in a {
    if !result.isEmpty {
        result += "user"
    }
    result += item
}
print(str1) // "Hello user! What user's details? Here user rounded with space."
print(result) // "Hello user! What user's details? Here user rounded with space."
print(result == str1) // true

/// Extension providing `split` and `substring` methods.
extension String {
    
    /// Split given string with substring into array
    /// - Parameters:
    ///   - string: the string
    ///   - substring: the substring to search
    /// - Returns: array of components
    func split(withSubstring substring: String) -> [String] {
        var a = [String]()
        var str = self
        while let range = str.range(of: substring) {
            let i = str.distance(from: str.startIndex, to: range.lowerBound)
            let j = str.distance(from: str.startIndex, to: range.upperBound)
            let left = str.substring(index: 0, length: i)
            let right = str.substring(index: j, length: str.length - j)
            a.append(left)
            str = right
        }
        if !str.isEmpty {
            a.append(str)
        }
        return a
    }
    
    /// the length of the string
    public var length: Int {
        return self.count
    }
    
    /// Get substring, e.g. "ABCDE".substring(index: 2, length: 3) -> "CDE"
    ///
    /// - parameter index:  the start index
    /// - parameter length: the length of the substring
    ///
    /// - returns: the substring
    public func substring(index: Int, length: Int) -> String {
        if self.length <= index {
            return ""
        }
        let leftIndex = self.index(self.startIndex, offsetBy: index)
        if self.length <= index + length {
            return String(self[leftIndex..<self.endIndex])
        }
        let rightIndex = self.index(self.endIndex, offsetBy: -(self.length - index - length))
        return String(self[leftIndex..<rightIndex])
    }

}

5赞 Nathan Day 2/9/2022 #39

最简单的解决方案是

let fullName = "First Last"

let components = fullName.components(separatedBy: .whitespacesAndNewlines).compactMap { $0.isEmpty ? nil : $0 }

这将在一行不同类型的(空格、制表符、换行符等)中处理多个空格,并且只返回一个双元素数组,您可以更改以包含更多您喜欢的字符,如果您想获得切肉刀,您可以使用正则表达式解码器,这允许您编写正则表达式,可用于将字符串直接解码到您自己的实现解码协议的类/结构中。对于这样的事情来说,这是过度杀戮,但如果你用它作为更复杂的字符串的例子,它可能更有意义。CharacterSet

1赞 Hetali Adhia 2/24/2022 #40

将字符串拆分为数组的简单方法

var fullName: String = "First Last";

var fullNameArr = fullName.componentsSeparatedByString(" ")

var firstName: String = fullNameArr[0]
var lastName: String = fullNameArr[1]

评论

0赞 Eric Aya 3/1/2022
已经在几个答案中提到过。
2赞 Max Potapov 4/28/2023 #41

不要使用空格分隔单词。它不适用于英语。它根本不适用于日语或中文等语言。

下面是从给定字符串中标记名称的示例:

import NaturalLanguage

actor Tokenizer {
    private let tagger = NLTagger(tagSchemes: [.nameType])

    func tokens(for text: String) async -> [String] {
        tagger.string = text

        let tags = tagger.tags(
            in: text.startIndex ..< text.endIndex,
            unit: .word,
            scheme: .nameType,
            options: [
                .omitPunctuation,
                .omitWhitespace,
                .joinNames,
            ]
        )

        return tags.map { String(text[$1]) }
    }
}

评论

0赞 Duncan C 10/25/2023
.nameType 是否足够智能,可以处理名称包含空格的“van Der Wal”或“de Gaulle”等情况?NLTagger