如何在swift中分离特定于字符串的单词

如何在swift中分离特定于字符串的单词,swift,string,Swift,String,比如说 var str = "ABCDEF" let result = str.someMethod("B") result[0] // "A" result[1] // "B" result[2] // "CDEF" let result2 = str.someMethod("A") result2[0] // "A" result2[1] // "BCDEF" var str2 = "BBBAAA" let result3 = str2.someMethod("B") result3[

比如说

var str = "ABCDEF"
let result = str.someMethod("B")

result[0] // "A"
result[1] // "B"
result[2] // "CDEF"

let result2 = str.someMethod("A")
result2[0] // "A"
result2[1] // "BCDEF"

var str2 = "BBBAAA"
let result3 = str2.someMethod("B")
result3[0] // "B"
result3[1] // "B"
result3[2] // "B"
result3[3] // "AAA"

var str3 = "BABBCDEDBB"
let result4 = str3.someMethod("B")
result4[0] // "B"
result4[1] // "A"
result4[2] // "B"
result4[3] // "B"
result4[4] // "CDED"
result4[5] // "B"
result4[6] // "B"
我怎么能那样呢

此方法与以下方法略有不同:

也许应该这样做

试试下面的方法

func someMethod(input: String, fullString: String) -> [String] {
    var array: [String] = []
    var string:String = ""

    for (index, char) in fullString.enumerated() {
        if String(char) == input {
            if string != "" {
                array.append(string)
                string = ""
            }
            array.append(input)
        } else {
            string.append(char)
            if index == fullString.count-1 {
                array.append(string)
            }
        }
    }
    return array
}
这样说吧

    let str = "BABBCDEDBB"
    let result = someMethod(input: "B", fullString: str)
    print(result)
您将获得以下输出

["B", "A", "B", "B", "CDED", "B", "B"]

下面是一个完整的答案,以字符串扩展名的形式编写。此解决方案可以满足您列出的所有需求,此外,它还可以处理您传入多字符搜索的情况

extension String {
    func someMethod(_ input: String) -> [String] {
        var result = [String]()
        var str = self
        repeat {
            if str.hasPrefix(input) {
                result.append(input)
                str.removeFirst(input.count)
            } else if let range = str.range(of: input) {
                result.append(String(str[..<range.lowerBound]))
                str.removeSubrange(..<range.lowerBound)
            } else {
                if !str.isEmpty {
                    result.append(str)
                }
                break
            }
        } while (true)
        return result
    }
}

let strs = ["ABCDEF", "BBBAAA", "BABBCDEDBB"]
for str in strs {
    let result = str.someMethod("B")
    print("B in \(str) -> \(result)")
}

print("A in \(strs[0]) -> \(strs[0].someMethod("A"))")
print("BB in \(strs[2]) -> \(strs[2].someMethod("BB"))")
输出:

ABCDEF中的B->[A,B,CDEF] BBBAAA中的B->[B,B,B,AAA] B在babbcdeb中->[B,A,B,B,CDED,B,B] ABCDEF中的A->[A,BCDEF] babbcdeb->[BA,BB,CDED,BB]


试试这个,它可以用于字符串和字符

func getResult(input:String, separator:String)->[String]{
    var arr = input.components(separatedBy: separator)
    var newArray = [String]()
    var count = 0
    while count < arr.count {
        if let lastObj = newArray.last{
            if lastObj == separator{
                newArray.append(arr[count] == "" ? separator : arr[count])
            }else{
                if arr[count] == ""{
                    newArray.append(separator)
                }else{
                    newArray.append(separator)
                    newArray.append(arr[count] == "" ? separator : arr[count])
                }
            }
        }else{
            newArray.append(arr[count] == "" ? separator : arr[count])
        }
        count += 1
    }
    return newArray
}

print(getResult(input: "ABCABDEA", separator: "AB"))
print(getResult(input: "ABCABDEA", separator: "A"))
[AB,C,AB,DEA]

[A,BC,A,BDE,A]


我想我终于从这个问题中得到了你需要的东西:拆分字符串并保留分隔符。您可以通过一个漂亮的字符串扩展来实现这一点:

extension String {
    func splitAndKeep(separator: Character) -> [String] {
        let separatorIndexes = enumerated().flatMap { $0.1 == separator ? index(startIndex, offsetBy: $0.0) : nil }
        let separatorRangeIndexes = separatorIndexes.flatMap { [$0, index(after: $0)] }
        let splitIndexes = [startIndex] + separatorRangeIndexes + [endIndex]
        let splitRangesEnds = zip(splitIndexes, splitIndexes.dropFirst()).filter { $0.0 < $0.1 }
        return splitRangesEnds.map { String(self[$0.0..<$0.1]) }
    }
}

@Cristik我只尝试了由以下内容分隔的组件:。我不知道如何访问它。那么,someMethod的预期行为应该是什么呢?单个元素在匹配之前,其余元素在匹配之后?B在字符串中多次出现的情况如何?@Cristik我添加了另一个情况。但是如果B也在字符串的末尾呢?那么这个方法应该怎么做呢?@Cristik再加一个案例……太好了。但有一个问题。它不适用于两位数、三位数等单词。例如BB或ABC…@allanWay两位数和三位数的期望输出是什么?请更新您的问题完美的解决方案。@allanWay很乐意帮助:
print("ABCDEF".splitAndKeep(separator: "B"))
// ["A", "B", "CDEF"]

print("ABCDEF".splitAndKeep(separator: "A"))
// ["A", "BCDEF"]

print("BBBAAA".splitAndKeep(separator: "B"))
// ["B", "B", "B", "AAA"]


print("BABBCDEDBB".splitAndKeep(separator: "B"))
// ["B", "A", "B", "B", "CDED", "B", "B"]