如何像 swift 中的变音"ä"一样用变音符号拆分字符串



我正在swift 5中编程一个搜索例程,如果搜索包含在这个字符串中,我想在字符串中突出显示(例如,如果我在类似于"äbcdef"的字符串中搜索"bcd",结果应该看起来像"äbcdef"。在这样做的过程中,我为string编写了一个扩展,将字符串拆分为与搜索字符串匹配之前的子字符串(="before"(、与搜索字符串的匹配(="match"(和之后的子字符串。

extension String {

func findSubstring(forSearchStr search: String, caseSensitive sensitive: Bool) -> (before: String, match: String, after: String) {

var before = self
var searchStr = search
if !sensitive {
before = before.lowercased()
searchStr = searchStr.lowercased()
}
var match = ""
var after = ""
let totalStringlength = before.count
let searchStringlength = searchStr.count
var startpos = self.startIndex
var endpos = self.endIndex
for id in 0 ... (totalStringlength - searchStringlength) {
startpos = self.index(self.startIndex, offsetBy: id)
endpos = self.index(startpos, offsetBy: searchStringlength)
if searchStr == String(before[startpos ..< endpos]) {
before = String(self[self.startIndex ..< startpos])
match = String(self[startpos ..< endpos])
if id < totalStringlength - searchStringlength - 1 {
startpos = self.index(startpos, offsetBy: searchStringlength)
after = String(self[startpos ..< self.endIndex])
}
break
}
}
return (before, match, after)
} // end findSubstring()

}

我的问题是,这个例程适用于所有没有特殊字符(如德语元音变音符"(的字符串;ä,ö,ü"或";ß";。如果一个字符串包含这些字符中的一个;匹配";以及";在";向右移动一个符号。在上面的例子中;bcd";在这种情况下是";äbcdef〃;

我的问题是,我必须做些什么才能正确处理这些角色?

顺便说一句:有没有比我更简单的解决方案来分割字符串,正如我所描述的那样(在我看来相当复杂:(

感谢您对的宝贵支持

字符串比较是一个复杂的问题,除非你正在研究这个问题,否则你不想自己处理。

只需使用String.range(of:options:):

extension String {
func findSubstring(forSearchStr search: String, caseSensitive sensitive: Bool) -> (before: String, match: String, after: String)? {
if let substringRange = range(of: search, options: sensitive ? [] : [.caseInsensitive], locale: nil) {
return (String(self[startIndex..<substringRange.lowerBound]),
String(self[substringRange]),
String(self[substringRange.upperBound..<self.endIndex]))
} else {
return nil
}
}
}
// (before: "ä", match: "bcd", after: "e")
print("äbcde".findSubstring(forSearchStr: "bcd", caseSensitive: true)!)

请注意,这不是字面上的比较。例如:

// prints (before: "", match: "ß", after: "")
print("ß".findSubstring(forSearchStr: "ss", caseSensitive: false)!)

如果要进行文字比较,请使用literal选项:

range(of: search, options: sensitive ? [.literal] : [.caseInsensitive, .literal])

相关内容

  • 没有找到相关文章

最新更新