[英]Split a String into an array in Swift?
假设我在这里有一个字符串:
var fullName: String = "First Last"
我想根据空格拆分字符串并将值分配给它们各自的变量
var fullNameArr = // something like: fullName.explode(" ")
var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]
此外,有时用户可能没有姓氏。
只需在您的fullName
上调用componentsSeparatedByString
方法
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]
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
与斯威夫特 2
在 Swift 2 中,由于引入了内部 CharacterView 类型,拆分的使用变得有点复杂。 这意味着 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
最简单的方法是使用 componentsSeparatedBy:
对于斯威夫特 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]
对于斯威夫特 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]
斯威夫特开发。 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 / 斯威夫特 3.0.1
这是使用数组的多个分隔符的方式。
import Foundation
let mathString: String = "12-37*2/5"
let numbers = mathString.components(separatedBy: ["-", "*", "/"])
print(numbers)
输出:
["12", "37", "2", "5"]
斯威夫特 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."
}
编辑/更新:
斯威夫特 5 或更高版本
为了只用非字母字符分割字符串,我们可以使用新的 Character 属性isLetter
:
let fullName = "First Last"
let components = fullName.split{ !$0.isLetter }
print(components) // "["First", "Last"]\n"
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: [",", " ", "!",".","?"])
这打印,
[“鲍勃”,“命中”,“a”,“球”,“”,“该”,“命中”,“球”,“飞”,“远”,“之后”,“它”,“是", "hit", "", "Hello", "", "Hie", "", "How", "r", "u", ""]
但是,如果要过滤掉空字符串,
let words = paragraph.components(separatedBy: [",", " ", "!",".","?"]).filter({!$0.isEmpty})
输出,
[“鲍勃”、“命中”、“a”、“球”、“该”、“命中”、“球”、“飞”、“远”、“之后”、“它”、“是”、“ hit", "Hello", "Hie", "How", "r", "u"]
但请确保Foundation已导入。
作为 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"]
斯威夫特 4
let words = "these words will be elements in an array".components(separatedBy: " ")
通常,人们一遍又一遍地重新发明这个问题和糟糕的解决方案。 这是空间吗? " " 以及 "\n"、"\t" 或一些你从未见过的 unicode 空白字符呢,这在很大程度上是因为它是不可见的。 虽然你可以逃脱
import Foundation
let pieces = "Mary had little lamb".componentsSeparatedByString(" ")
如果您需要摆脱现实,请观看有关字符串或日期的 WWDC 视频。 简而言之,让苹果解决这种平凡的任务几乎总是更好。
恕我直言,正确执行此操作的方法是使用NSCharacterSet
,因为如前所述,您的空白可能不是您所期望的,并且 Apple 提供了空白字符集。 要探索提供的各种字符集,请查看 Apple 的NSCharacterSet 开发人员文档,然后,如果它不符合您的需求,则只有在此之后,才能扩充或构建新的字符集。
返回一个字符集,其中包含 Unicode 通用类别 Zs 和 CHARACTER TABULATION (U+0009) 中的字符。
let longerString: String = "This is a test of the character set splitting system"
let components = longerString.components(separatedBy: .whitespaces)
print(components)
在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!"]"
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))
Swift 4 让拆分字符变得更加容易,只需对字符串使用新的拆分功能。
示例: let s = "hi, hello" let a = s.split(separator: ",") print(a)
现在你得到了一个带有“hi”和“hello”的数组。
斯威夫特 3
let line = "AAA BBB\t CCC"
let fields = line.components(separatedBy: .whitespaces).filter {!$0.isEmpty}
AAA
、 BBB
和CCC
.whitespaces
替换为.whitespacesAndNewlines
只有split
是正确的答案,这里有超过 2 个空格的差异。
斯威夫特 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"]
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 文档。
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
这些答案中的大多数都假设输入包含一个空格——不是空格,而是一个空格。 如果您可以安全地做出这个假设,那么接受的答案(来自贝内特)是非常优雅的,也是我将尽可能采用的方法。
当我们无法做出这样的假设时,更强大的解决方案需要涵盖以下大多数答案未考虑的情况:
\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"]
我有一个场景,在我想要拆分的字符串中可以存在多个控制字符。 我没有维护这些数组,而是让 Apple 处理这部分。
以下适用于 iOS 10 上的 Swift 3.0.1:
let myArray = myString.components(separatedBy: .controlCharacters)
我发现了一个有趣的案例,
方法一
var data:[String] = split( featureData ) { $0 == "\u{003B}" }
当我使用此命令从从服务器加载的数据中拆分某些符号时,它可以在模拟器中测试并与测试设备同步时拆分,但它不会在发布应用程序和 Ad Hoc 中拆分
我花了很多时间来跟踪这个错误,它可能来自一些 Swift 版本,或者一些 iOS 版本,或者两者都不是
这也与 HTML 代码无关,因为我尝试使用stringByRemovingPercentEncoding并且仍然无法正常工作
2015 年 10 月 10 日补充
在 Swift 2.0 中,此方法已更改为
var data:[String] = featureData.split {$0 == "\u{003B}"}
方法二
var data:[String] = featureData.componentsSeparatedByString("\u{003B}")
当我使用此命令时,它可以正确拆分从服务器加载的相同数据
结论,我真的建议使用方法2
string.componentsSeparatedByString("")
在 Swift 4 中将字符串拆分为数组的步骤。
注意: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)
这直接给出了一个拆分部分的数组
var fullNameArr = fullName.components(separatedBy:" ")
然后你可以像这样使用,
var firstName: String = fullNameArr[0]
var lastName: String? = fullnameArr[1]
或者没有闭包,你可以在 Swift 2 中做到这一点:
let fullName = "First Last"
let fullNameArr = fullName.characters.split(" ")
let firstName = String(fullNameArr[0])
斯威夫特 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
最简单的解决方案是
let fullName = "First Last"
let components = fullName.components(separatedBy: .whitespacesAndNewlines).compactMap { $0.isEmpty ? nil : $0 }
这将处理一行不同类型(空格、制表符、换行符等)中的多个空格,并且只返回一个两个元素数组,您可以更改CharacterSet
以包含更多您喜欢的字符,如果您想获得可以使用的切割器正则表达式解码器,这使您可以将可用于将字符串解码的正则表达式直接写入您自己的实现解码协议的类/结构中。 对于这样的事情已经过头了,但是如果您将其用作更复杂字符串的示例,则可能更有意义。
假设您有一个名为“Hello World”的变量,如果您想将其拆分并将其存储到两个不同的变量中,您可以像这样使用:
var fullText = "Hello World"
let firstWord = fullText.text?.components(separatedBy: " ").first
let lastWord = fullText.text?.components(separatedBy: " ").last
这在 Beta 5 中再次发生了变化。Weee! 它现在是 CollectionType 上的一个方法
老的:
var fullName = "First Last"
var fullNameArr = split(fullName) {$0 == " "}
新的:
var fullName = "First Last"
var fullNameArr = fullName.split {$0 == " "}
let str = "one two"
let strSplit = str.characters.split(" ").map(String.init) // returns ["one", "two"]
Xcode 7.2 (7C68)
Swift 2.2错误处理和大写字符串添加:
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
}
从其他答案中可以看出,字符串处理在 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)
我正在寻找松散的拆分,例如 PHP 的explode
,其中空序列包含在结果数组中,这对我有用:
"First ".split(separator: " ", maxSplits: 1, omittingEmptySubsequences: false)
输出:
["First", ""]
对于 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]
这是我刚刚构建的一种算法,它将通过数组中的任何Character
拆分String
,如果有任何希望保留具有拆分字符的子字符串,可以将swallow
参数设置为true
。
Xcode 7.3 - 斯威夫特 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", "--"]
关闭顶部:
对于搜索如何用子字符串(不是字符)拆分字符串的人,这里是可行的解决方案:
// 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])
}
}
根据 Swift 2.2
您只需编写 2 行代码,您将获得拆分字符串。
let fullName = "FirstName LastName"
var splitedFullName = fullName.componentsSeparatedByString(" ")
print(splitedFullName[0])
print(splitedFullName[1])
享受。 :)
我还没有找到可以处理具有 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)
}
let fullName : String = "Steve.Jobs"
let fullNameArr : [String] = fullName.components(separatedBy: ".")
var firstName : String = fullNameArr[0]
var lastName : String = fullNameArr[1]
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"
阐述Don Vaughn 的答案,我喜欢使用正则表达式。 我很惊讶这只是第二个正则表达式答案。 但是,如果我们可以只用一种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"
将字符串拆分为数组的简单方法
var fullName: String = "First Last"; var fullNameArr = fullName.componentsSeparatedByString(" ") var firstName: String = fullNameArr[0] var lastName: String = fullNameArr[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)
这是用于 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 ")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.