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]