如何在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"]