在Swift中将String拆分为数组?

时间:2014-09-05 03:51:01

标签: ios string swift split

说我在这里有一个字符串:

var fullName: String = "First Last"

我想在白色空间上拆分字符串,并将值分配给各自的变量

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

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

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

36 个答案:

答案 0 :(得分:923)

只需在componentsSeparatedByString

上调用fullName方法即可
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]

答案 1 :(得分:743)

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协议,您必须使用.characters属性来访问String实例的CharacterView类型表示。 (注意:CharacterView确实采用SequenceType和CollectionType协议)。

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 

答案 2 :(得分:165)

最简单的方法是使用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]

答案 3 :(得分:105)

Swift Dev。 4。0(2017年5月24日)

Swift 4中的新功能split Beta )。

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"]

答案 4 :(得分:50)

作为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"]

答案 5 :(得分:47)

Swift 4

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

答案 6 :(得分:41)

Xcode 9 Swift 4 Xcode 8.2.1•Swift 3.0.2

如果您只需要正确格式化人名,则可以使用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或更高版本

如果只是按非字母字符拆分字符串,我们可以使用新的字符属性isLetter

let fullName = "First Last"

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

答案 7 :(得分:28)

空白问题

一般来说,人们一遍又一遍地重塑这个问题和糟糕的解决方案。这是一个空间吗? “”以及“\ n”,“\ t”或者你从未见过的一些unicode空白字符,在很大程度上是因为它是看不见的。虽然你可以逃脱

弱解决方案

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

如果您需要动摇现实,请观看字符串或日期的WWDC视频。简而言之,允许Apple解决这种平凡的任务几乎总是更好。

强大的解决方案:使用NSCharacterSet

正确地执行此操作的方法,恕我直言,是使用NSCharacterSet,因为如前所述,您的空白可能不是您所期望的,Apple提供了空格字符集。要探索各种提供的字符集,请查看Apple的NSCharacterSet developer documentation,然后,只有在不符合您需要的情况下,才会扩充或构建新的字符集。

NSCharacterSet空格

  

返回包含Unicode General中字符的字符集   Zs和CHARACTER ZABULATION(U + 0009)。

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

答案 8 :(得分:23)

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!"]"

By Apple Documentation....

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

答案 9 :(得分:20)

Swift 4使分割字符变得更容易,只需使用字符串的新分割功能。

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

现在你有一个'hi'和'hello'的数组。

答案 10 :(得分:14)

Swift 3

let line = "AAA    BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
  • 返回三个字符串AAABBBCCC
  • 过滤掉空白字段
  • 处理多个空格和制表字符
  • 如果您要处理新行,请将.whitespaces替换为.whitespacesAndNewlines

答案 11 :(得分:12)

Xcode 8.0 / Swift 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

答案 12 :(得分:10)

只有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"]

答案 13 :(得分:8)

我有一个场景,在我要分割的字符串中可以出现多个控制字符。我只是让Apple处理这一部分,而不是维护这些部分。

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

let myArray = myString.components(separatedBy: .controlCharacters)

答案 14 :(得分:8)

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

方法1

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

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

我需要花费大量时间来跟踪此错误,它可能会受到一些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("")

答案 15 :(得分:7)

这些答案中的大多数假设输入包含空格 - 而不是白色空间,以及单个空格。如果你可以安全地做出这个假设,那么接受的答案(来自bennett)是非常优雅的,也是我能用的方法。

当我们无法做出这样的假设时,一个更强大的解决方案需要涵盖以下大多数答案都不要考虑的问题:

  • 标签/换行符/空格(空格),包括重复字符
  • 领先/尾随空白
  • Apple / Linux(\n Windows(\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"]

答案 16 :(得分:7)

Swift 4,Xcode 10和iOS 12更新100%正常工作

time wkhtmltopdf input.html output.pdf

有关更多信息,请参见Apple's documentation here

答案 17 :(得分:5)

这将直接直接

给出拆分部分的数组
var fullNameArr = fullName.components(separatedBy:" ")

然后您可以像这样使用

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

答案 18 :(得分:3)

希望这是有帮助的

Swift 4:将字符串拆分为数组。第1步:分配字符串。第2步:基于@ spliting。注意: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)

答案 19 :(得分:2)

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
}

答案 20 :(得分:2)

let str = "one two"
let strSplit = str.characters.split(" ").map(String.init) // returns ["one", "two"]

Xcode 7.2(7C68)

答案 21 :(得分:2)

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

var fullText = "Hello World"
let firstWord = fullText.text?.components(separatedBy: " ").first
let lastWord = fullText.text?.components(separatedBy: " ").last

答案 22 :(得分:2)

快捷键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

答案 23 :(得分:1)

这是我刚刚构建的算法,它将从数组中分割String任何Character,如果有任何希望保留带有分割字符的子串,可以设置{{1参数swallow

Xcode 7.3 - Swift 2.2:

true

示例:

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

答案 24 :(得分:1)

更新Swift 5和简单的方法

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: [",", " ", "!",".","?"])

此打印,

  

[“鲍勃”,“命中”,“一个”,“球”,“”,“该”,“命中”,“球”,“飞”,“远”,   “之后”,“它”,“是”,“命中”,“”,“你好”,“”,“ Hie”,“”,“如何”,“ r”,   “ u”,“”]

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

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

输出

  

[“鲍勃”,“命中”,“一个”,“球”,“该”,“命中”,“球”,“飞”,“远”,   “之后”,“它”,“是”,“命中”,“你好”,“ Hie”,“如何”,“ r”,“ u”]

但请确保已导入基金会

答案 25 :(得分:1)

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

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

输出:

["First", ""]

答案 26 :(得分:1)

这已经在Beta 5中再次改变了.Weee!它现在是CollectionType

上的一个方法

旧:

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

新:

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

Apples Release Notes

答案 27 :(得分:1)

对于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]

答案 28 :(得分:1)

字符串处理在Swift中仍然是一个挑战,并且它会不断变化,正如您可以从其他答案中看到的那样。希望事情能够安定下来并且变得更加简单。这是使用当前3.0版本的Swift和多个分隔符进行此操作的方法。

斯威夫特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)

答案 29 :(得分:1)

根据Swift 2.2

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

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

享受。 :)

答案 30 :(得分:0)

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”

答案 31 :(得分:0)

我还没有找到能够处理包含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)
}

答案 32 :(得分:0)

Don Vaughn's Answer开始,我喜欢使用正则表达式。我很惊讶这只是第二个Regex答案。但是,如果我们仅用一种split方法而不是多种方法来解决这个问题,那就太好了。

我还受到Mithra Singam's 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"

答案 33 :(得分:0)

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 = lowStr.distance(from: lowStr.startIndex, to: range.lowerBound)
            let j = lowStr.distance(from: lowStr.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])
    }

}

答案 34 :(得分:-1)

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

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)

答案 35 :(得分:-1)

这是用于Swift 4.2的String和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 ")