我们如何根据特定范围拆分字符串?迅速

时间:2018-01-01 15:44:29

标签: swift swift4

我们如何根据特定范围拆分字符串,并将切片的项目放在数组中,如下例所示:

let sentence = "Str1 {M} Str2 {/M} Str3 {M} Str4 {/M} {M} Str5 {/M} Str6 {M} Str7 {/M}"

注意: Str1,Str2 ...是一个字符串

我想要的:(1,2,3和4)

 1) OutputBetweenM = [Str2, Str4, Str5, Str7]
 2) OutputOutsideM = [Str1, Str3, Str6]
 3) OutputBetweenM_Edited = [Str2Edited, Str4Edited, Str5Edited, Str7Edited]
 4) Output3 = [Str1, Str2Edited, Str3, Str4Edited, Str5Edited, Str6, Str7Edited]

最后通过在Output3中添加新项目(对我来说很容易)来重写新句子来获得这个:

let Final_sentence = "Str1 {M} Str2Edited {/M} Str3 {M} Str4Edited {/M} {M} Str5Edited {/M} Str6 {M} Str7Edited {/M}"

这就是我尝试做的事:
第一个代码:

let from = NSRegularExpression.escapedPattern(for: "{M}") // escapedPattern
let to = NSRegularExpression.escapedPattern(for: "{/M}")
let regex = "(?<=\(from))(.*?)(?=\(to))"
let ranges = sentence.ranges(of: regex, options: .regularExpression)
let matches = ranges.map{ sentence[$0] }
print(matches) /* OutputBetweenM: [" Str2 ", " Str4 ", " Str5 ", " Str7 "]  ( Correct ) */

第二代码:

let from = NSRegularExpression.escapedPattern(for: "{M}") // escapedPattern
let to = NSRegularExpression.escapedPattern(for: "{/M}")

let regexIncluding = from + ".*?" + to
let rangesIncluding = sentence.ranges(of: regexIncluding, options: .regularExpression)
var mutableSentence = sentence
print(mutableSentence)
for range in rangesIncluding.reversed() {
    mutableSentence.replaceSubrange(range, with: "\n")
}
let excludedOnes = mutableSentence.components(separatedBy: .newlines)
print(excludedOnes) /* OutputOutsideM: ["Str1 ", " Str3 ", " ", " Str6 ", ""]  ( InCorrect :/) 
 Correct one : ["Str1 ", " Str3 ", " Str6 "] */

使用的扩展程序:来自此页面中的帖子:Index of a substring in a string with Swift

func ranges(of string: String, options: CompareOptions = .literal) -> [Range<Index>] {
    var result: [Range<Index>] = []
    var start = startIndex
    while let range = range(of: string, options: options, range: start..<endIndex) {
        result.append(range)
        start = range.lowerBound < range.upperBound ? range.upperBound : index(range.lowerBound, offsetBy: 1, limitedBy: endIndex) ?? endIndex
    }
    return result
}

在那之后,我不知道如何将它们像Output3一样放到@ leo-dabus以获得他的帮助。
提前致谢!

1 个答案:

答案 0 :(得分:1)

问题不是那么清楚,但如果我理解正确应该是简单的。您只需要将excludedOnes和已编辑的列表压缩在一起,枚举压缩数组并将元组的每个元素附加到Output3。一旦你有了Output3数组,只需过滤trimmingCharacters(in: .whitespaces)不等于空字符串,并用你编辑过的数组替换找到的范围:

let excludedOnes = ["Str1 ", " Str3 ", " ", " Str6 ", ""]
let OutputBetweenM_Edited = ["Str2Edited", "Str4Edited", "Str5Edited", "Str7Edited"]

let zipped = zip(excludedOnes,OutputBetweenM_Edited)
print(zipped)
var output3: [String] = []
for item in zipped {
    output3.append(item.0)
    output3.append(item.1)
}
output3 = output3.filter{ $0.trimmingCharacters(in: .whitespaces) != "" }   
print("output3:",output3)
  

output3:[“Str1”,“Str2Edited”,“Str3”,“Str4Edited”,“Str5Edited”,   “Str6”,“Str7Edited”]

相关问题