Swift 从a部分到b部分拆分一个快速字符串?
我正在寻找一种方法,将整个文本拆分为两个或更多部分。因此,如果我有以下代码:Swift 从a部分到b部分拆分一个快速字符串?,swift,string,substring,Swift,String,Substring,我正在寻找一种方法,将整个文本拆分为两个或更多部分。因此,如果我有以下代码: var Text = "INGREDIENTS\n Milk \nSugar \nSoda \nINFORMATIONS \nYou need to add more sugar" var SplitPart1 = "" var SplitPart2 = "" 如何在“SplitPart1”和“SplitPart2”中将零件从“成分”转换为“信息”? 最后,我需要这两个字符串: 拆分部分1:配料\n牛奶\n加奶\n
var Text = "INGREDIENTS\n Milk \nSugar \nSoda \nINFORMATIONS \nYou need to add more sugar"
var SplitPart1 = ""
var SplitPart2 = ""
如何在“SplitPart1”和“SplitPart2”中将零件从“成分”转换为“信息”?
最后,我需要这两个字符串:
拆分部分1:配料\n牛奶\n加奶\n酸盐\n
拆分部分2:信息\n您需要添加更多的糖我进行了快速搜索并找到了,但是,立即使用的答案并不十分明显,因此我编写了此快速测试
let text = "INGREDIENTS\n Milk \nSugar \nSoda \nINFORMATIONS \nYou need to add more sugar"
if let range = text.range(of: "INFORMATIONS") {
let start = text[..<range.lowerBound]
let end = text[range.lowerBound...]
print("start:", start)
print("end:", end)
}
以下是拆分和连接字符串的一般方法:
extension String{
func split(_ separatingString: String) -> [String]{
return components(separatedBy: separatingString).reduce(into: [], { (result, next) in
result.isEmpty ? result.append(next) : result.append(separatingString + next)
})}}
var Text = "INGREDIENTS\n Milk \nSugar \nSoda \nINFORMATIONS \nYou need to add more sugar"
print(Text.split("INFORMATIONS"))
对于具有更多关键字的扩展
扩展可以是这样的:
extension String{
func split(_ separatingString: String) -> [String]{
let array = components(separatedBy: separatingString)
return array.first!.isEmpty ? array.dropFirst().map{separatingString + $0} :
[array.first!] + array.dropFirst().map{separatingString + $0}
}
func splitArray(_ array :[String]) -> [String]{
return array.reduce( [self]) { (result, next) -> [String] in
return [String](result.compactMap{$0.split(next)}.joined())
}
}
}
var Text = "INGREDIENTS\n Milk \nSugar \nSoda \nINFORMATIONS \nYou need to add more sugar"
print(Text.splitArray(["INFORMATIONS", "add", "Milk", "INGREDIENTS", "suger"]))
//["INGREDIENTS\n ", "Milk \nSugar \nSoda \n", "INFORMATIONS \nYou need to ", "add more sugar"]
print(Text.splitArray(["INFORMATIONS", "INGREDIENTS"]))
print(Text.splitArray(["INGREDIENTS", "INFORMATIONS"]))
// ["INGREDIENTS\n Milk \nSugar \nSoda \n", "INFORMATIONS \nYou need to add more sugar"]
// ["INGREDIENTS\n Milk \nSugar \nSoda \n", "INFORMATIONS \nYou need to add more sugar"]
这不是最快的方法,但逻辑清晰。关键字不需要在这里排序。如果您知道顺序,则此方法比序列尾递归慢。前提是您仅获取此格式的字符串,并且无法更改它。下面是一些尝试,使其动态。您将得到拆分的数组,可用于填充数据
var Text = "INGREDIENTS\n Milk \nSugar \nSoda \nINFORMATIONS \nYou need to add more sugar \nSOMETHINGELSE \n Deliver soon"
//1) Define the Seperator Keys
let SeperatorKey: Set = ["INGREDIENTS", "INFORMATIONS", "SOMETHINGELSE"]
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
splitString(text: Text)
}
//2.This method will split the strings based on SeperatorKey
func splitString(text: String){
let textArray = text.split(separator: "\n")
let (count, indexes) = getNumberAndIndexOfCategories(textArray: textArray)
for i in 0..<count {
let startIndex = indexes[i]
let endIndex = i == (count - 1) ? textArray.count : indexes[i+1]
let subTextArray = textArray[startIndex..<endIndex]
print("SubText = \(subTextArray)")
}
}
func getNumberAndIndexOfCategories(textArray: [String.SubSequence]) -> (Int, [Int]){
var count = 0
var indexes: [Int] = []
for (index, string) in textArray.enumerated() {
let trimmedString = string.trimmingCharacters(in: .whitespaces)
if SeperatorKey.contains(String(trimmedString)){
count = count + 1
indexes.append(index)
}
}
return (count, indexes)
}
}
var Text=“配料\n牛奶\nSugar\nSoda\n信息\n您需要添加更多的糖\nsomethinglese\n尽快交付”
//1) 定义分隔键
让我们分开工作:集合=[“成分”、“信息”、“某些东西”]
类ViewController:UIViewController{
重写func viewDidLoad(){
super.viewDidLoad()
拆分字符串(文本:文本)
}
//2.此方法将基于separatorey拆分字符串
func拆分字符串(文本:字符串){
让textArray=text.split(分隔符:“\n”)
let(计数,索引)=getNumberAndIndexOfCategories(textArray:textArray)
对于0中的我…可能是Wow的副本,这很快就成功了。非常感谢!:)哦,我还有一个问题…如果我需要第三个部分,我如何分离第三个部分?也许可以将第二个部分作为单独的步骤分离,但是你也可以从初始文本中获得文本范围。uuhhhh创造性缩进是什么?此外,您可以只使用joined(分隔符:)
,而不是自己用reduce实现它。它更清晰。而且你不应该检查如果result.count==0
检查它是否为空结果。isEmpty
@Alexander,结果是一个数组而不是一个字符串。要检查集合是否为空,请使用它的isEmpty属性,而不是将count与零进行比较。除非ction保证了随机访问性能,计算计数可以是一个O(n)操作。
var Text = "INGREDIENTS\n Milk \nSugar \nSoda \nINFORMATIONS \nYou need to add more sugar \nSOMETHINGELSE \n Deliver soon"
//1) Define the Seperator Keys
let SeperatorKey: Set = ["INGREDIENTS", "INFORMATIONS", "SOMETHINGELSE"]
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
splitString(text: Text)
}
//2.This method will split the strings based on SeperatorKey
func splitString(text: String){
let textArray = text.split(separator: "\n")
let (count, indexes) = getNumberAndIndexOfCategories(textArray: textArray)
for i in 0..<count {
let startIndex = indexes[i]
let endIndex = i == (count - 1) ? textArray.count : indexes[i+1]
let subTextArray = textArray[startIndex..<endIndex]
print("SubText = \(subTextArray)")
}
}
func getNumberAndIndexOfCategories(textArray: [String.SubSequence]) -> (Int, [Int]){
var count = 0
var indexes: [Int] = []
for (index, string) in textArray.enumerated() {
let trimmedString = string.trimmingCharacters(in: .whitespaces)
if SeperatorKey.contains(String(trimmedString)){
count = count + 1
indexes.append(index)
}
}
return (count, indexes)
}
}