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