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

Arrays 在Swift中将字符串拆分为数组?,arrays,swift,string,split,Arrays,Swift,String,Split,假设我这里有一个字符串: var fullName: String = "First Last" 我希望根据空白分割字符串,并将值分配给各自的变量 var fullNameArr = // something like: fullName.explode(" ") var firstName: String = fullNameArr[0] var lastName: String? = fullnameArr[1] 此外,有时用户可能没有姓氏。最简单的方法是使用ComponentSep

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

var fullName: String = "First Last"
我希望根据空白分割字符串,并将值分配给各自的变量

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

var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]
此外,有时用户可能没有姓氏。

最简单的方法是使用ComponentSeparatedBy:

对于Swift 2:

对于Swift 3:

只需在您的全名上调用ComponentSeparatedByString方法

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

快速的方法是使用全局分割函数,如下所示:

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

在Swift 2中,由于引入了内部CharacterView类型,拆分的使用变得有点复杂。这意味着字符串不再采用SequenceType或CollectionType协议,而必须使用.characters属性访问字符串实例的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 
Swift 4或更高版本

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

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

编辑/更新:

Swift 5或更高版本

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


我发现了一个有趣的案例

方法1

当我使用这个命令从服务器加载的数据中分割一些符号时,它可以在模拟器中进行测试并与测试设备同步时分割,但在发布应用程序中不会分割,并且是临时的

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

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

2015年10月10日增补

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

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

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

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


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

旧的:

新的:


或者不使用闭包,您可以在Swift 2中执行此操作:

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

对于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]
空白问题 一般来说,人们一次又一次地重复这个问题和糟糕的解决方案。这是一个空间吗?那么\n、\t或一些您从未见过的unicode空白字符呢,这在很大程度上是因为它是不可见的。而你却可以逍遥法外

弱解 如果你需要摆脱现实的束缚,可以观看WWDC关于字符串或日期的视频。简言之,让苹果解决这类平凡的任务几乎总是更好的

强健的解决方案:使用NSCharacterSet IMHO,正确的方法是使用NSCharacterSet,因为如前所述,您的空白可能不是您所期望的,并且苹果已经提供了空白字符集。要探索提供的各种角色集,请查看Apple的,然后,只有这样,如果不适合您的需要,才可以扩充或构建新的角色集

NSCharacterSet空白 返回包含Unicode常规格式字符的字符集 Zs类和字符表U+0009


Xcode 7.2 7C68

这里是我刚刚构建的一个算法,它将从数组中按任意字符分割字符串,如果希望保留带有分割字符的子字符串,可以将swallow参数设置为true

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", "--"]
Swift 2.2 添加了错误处理和大写字符串:


大多数答案都假设输入包含一个空格,而不是空格,并且在该空格处只有一个空格。如果你能安全地做出这样的假设,那么贝内特接受的答案是相当优雅的,也是我将在可能的时候采用的方法

当我们不能做出这样的假设时,一个更稳健的解决方案需要涵盖以下大多数答案没有考虑到的情况:

制表符/换行符/空格空格,包括重复出现的字符 前导/尾随空格 Apple/Linux\n和Windows\r\n换行符 为了涵盖这些情况,此解决方案使用正则表达式将所有空白(包括重复出现的字符和Windows换行符)转换为单个空格,修剪,然后按单个空格拆分:

Swift 3:

Xcode 8.0/Swift 3

漫长的道路:

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
Swift开发4.0 2017年5月24日

Swift 4测试版中的新功能拆分

输出:

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

下面是使用数组的多个分隔符的方法

输入信息 日期 设mathString:String=12-37*2/5 设numbers=mathString.ComponentSeparatedBy:[-,*,/] 印刷号码 输出:

["Hello", "Swift", "4", "2017"]
[12, 37, 2, 5]
我有一个场景,在我想要拆分的字符串中可以存在多个控制字符。我并没有维护一系列这些,而是让苹果来处理这部分

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

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

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

Swift 3:


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

例如: 嗨,你好 设a=s.splitseparator:, 版画

现在您得到了一个带有“hi”和“hello”的数组。

Swift 4

斯威夫特3

返回三个字符串AAA、BBB和CCC 过滤掉空字段 处理多个空格和制表字符 如果要处理新行,请将.whitespaces替换为.whitespaces和newlines
在Swift 4中将字符串拆分为数组的步骤

分配字符串 基于@spliting。 注意:variableName.componentsseparatedBy:split关键字

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)

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

var fullText = "Hello World"
let firstWord = fullText.text?.components(separatedBy: " ").first
let lastWord = fullText.text?.components(separatedBy: " ").last
斯威夫特4

输出

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

有关更多信息,请参阅。

我正在寻找loosy split,例如PHP的explode,其中空序列包含在结果数组中,这对我很有用:

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

["Hello", "Swift", "4", "2017"]
在Swift 4.2和Xcode 10中

选择1

选择2

选择3

选择4


更新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: [",", " ", "!",".","?"])
这张照片

[鲍勃,打,球,打,球,飞,远, 之后,它,是,击中,你好,嗨,怎么,r, u、 ]

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

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

[鲍勃,打,球,打,球,飞,远, 之后,它,是,击中,你好,Hie,How,r,u]

但请确保,基础是导入的。

这给出了一个分裂部分的数组,直接为

然后你可以这样用

var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]
只有拆分是正确答案,这里是两个以上空格的差异

斯威夫特5

var temp=你好,世界倪浩 设arr=temp.componentsseparatedBy:。空格和换行符 //[你好,世界,倪,郝] 设arr2=由以下部件分离的温度部件: //[你好,世界,倪,郝] 设arr3=temp.splitwhereSeparator:{$0=} //[你好,世界,倪,郝]
嗨,我没有要检查的Mac电脑。但是您可以尝试“fullName.componentsSeparatedByStringstring:”不要复制和粘贴,请使用autocompletetef函数,这样您就可以得到正确的函数。如果您只按一个字符进行拆分,那么使用fullName.utf8.split也可以将.utf8替换为.utf16。例如,可以使用fullName.utf8.split43在+上进行拆分。此外,有时姓氏中有空格,如Daphne du Maurier或Charles de LintI发现了这样一个好处:,在我的测试中,组件由字符串分离通常要快得多,尤其是在处理需要拆分为多个片段的字符串时。但是对于OP列出的示例,两者都应该足够。从Xcode 6.2b3开始,split可以用作splita:b::c:,{$0==:},maxSplit:Int.max,allowEmptySlices:false。请记住,如果分隔符长度超过一个字符,则仍然需要使用旧的componentsSeparatedByString方法。很遗憾,让firstName,lastName=splitfullName{$0='''''}这样说很酷,但这不管用。@Kashif那么你可以使用splita,b;c、 d{$0==,| |$0==}或拆分a,b;c、 d{contains,;,$0}Xcode 7.0的正确代码为fullNameArr=fullName.characters.split{$0=}.mapString.init。试图编辑,但被拒绝了。这有记录吗,莫里?如果我需要拆分除了单个字符之外的东西呢?whitespaceAndNewlineCharacterSet@Crashalot有两个函数:由字符串分隔的组件和componentsSeparatedByCharactersInSet@MdRais你应该问一个新问题,这是一个6年,注意到这实际上是一个底层的NString在导入基础时快速自动交换它们。在Swift 1.2中不再是这样的情况,即苹果不再自动地将SWIFT的字符串转换成NString。这个答案在XClice 7 beta 4和SWIFT 2中起作用。XCODE现在自动完成Swift字符串对象的基础方法,而不需要将类型转换为NString,这在XFlice 6.4中使用SWIFT 1.1.2不是这样的。直到导入基础为止,它在RePL中不起作用。这完全符合预期,即FullNAMEARR是[XCOD7.7.]中的[String ]。因为您可能希望允许使用或分隔字符串;或任何其他分离器@
MdRais您可以用于:in来访问字符串中的单个字符-注意,每个元素都是一个字符。我会说这几乎不是答案状态,因为它主要是对现有答案的注释。但它指出了一些重要的事情。我同意。在看到以空格分隔的答案后,我想到的第一件事是:如果输入文本包含几个连续的空格,会发生什么?如果它有标签呢?全宽CJK空间?请确保将导入基础添加到您使用的类中。savedyouveminutesavedyouveminutesavedyouveminutesavedyouveminutesavedyouveminutesavedyouveminutesavedyouvefinutesavedyouveminutesavedyouvefinutesavedyouveminutesavedyouvefiveminutesavedyouveminutesavedyouvefinutesavedyouvefinutesa。可以使用omittingEmptySubsequences:false更改此设置,默认情况下为true。Swift 4+中的任何多字符拆分?请注意,这不会返回字符串数组,而是返回子字符串数组,使用起来很不方便。@DarrelRoot您只需映射子字符串fullName.split{$0.isWhitespace}.mapString.initI我喜欢这个新API,但请记住它返回子字符串。我需要字符串,并希望在一般情况下分割空白,所以我这样做了:让words=line.split{$0.isWhitespace}.map{String$0}感谢@LeoDabus提供的版本,我的原始注释缺少代码。我还建议将Swift 5版本移到答案的顶部。@MdRais let name=JOHN printArraynameTry将单词转换为字符数据类型。请注意,在某些边缘情况下,这有不同的行为。例如:/users/4使用split将产生两个元素,而使用components将产生三个元素,第一个是空字符串。杰出!为我工作。。
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", "--"]
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
}
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"]
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
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
let myArray = myString.components(separatedBy: .controlCharacters)
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)
let words = "these words will be elements in an array".components(separatedBy: " ")
let line = "AAA    BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
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)
var fullText = "Hello World"
let firstWord = fullText.text?.components(separatedBy: " ").first
let lastWord = fullText.text?.components(separatedBy: " ").last
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
let fullName = "First Last"    
let fullNameArr = fullName.components(separatedBy: " ")
let firstName = fullNameArr[0] //First
let lastName = fullNameArr[1] //Last
"First ".split(separator: " ", maxSplits: 1, omittingEmptySubsequences: false)
["First", ""]
//This is your str
let str = "This is my String" //Here replace with your string
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!)
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)
let arr = str.split {$0 == " "}
print(arr)
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!"]"
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))
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: [",", " ", "!",".","?"])
let words = paragraph.components(separatedBy: [",", " ", "!",".","?"]).filter({!$0.isEmpty})
var fullNameArr = fullName.components(separatedBy:" ")
var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]