我尝试做的事情应该很简单,但由于Swifts处理字符串索引和字符,我只能提出详细的解决方案。基本上我有一个很大的指令列表,存储为一个字符串数组。示例值为:
"1) Do this thing"
"2) Do that thing"
我想从这些字符串中删除编号(例如"1) "
),以便稍后在将字符串添加到UITextView
时创建自己的格式。
我已经能够使用以下代码:
func removeNumbering(from instruction: inout String) {
var indexOfFirstLetter = 0
for (index, character) in instruction.unicodeScalars.enumerated() {
if NSCharacterSet.letters.contains(character) {
indexOfFirstLetter = index
break
}
}
let range = instruction.startIndex ..< instruction.index(instruction.startIndex, offsetBy: indexOfFirstLetter)
instruction.removeSubrange(range)
}
有更简洁的方法吗?似乎我应该能够删除字符,直到循环找到第一个字母,但是从循环内访问unicodeScalar
和String.Index
已经证明是困难的。
对此功能有任何建议或改进吗?
答案 0 :(得分:1)
在不了解字符串的情况下,假设它们都在第一个字母之前直接使用相同的模式,这个方法是一个解决方案:
extension String {
var strip: String {
var copy = self
for c in copy.characters {
guard c == " " else { continue }
copy.removeSubrange(copy.startIndex...copy.characters.index(of: c)!)
break
}
return copy
}
}
"1) Do something".strip // "Do something"
"1234567890 Text".strip // "Text"
显然,如果字符串的模式与上述假设相冲突,这种方法是不安全的。
答案 1 :(得分:1)
这个怎么样:
var s1 = "1) Do this thing"
var s2 = "2) Do that thing"
s1.characters.removeFirst(3)
print(s1) // prints "Do this thing"
s2.characters.removeFirst(3)
print(s2) // prints "Do this thing"
如果您需要更精细的修剪,请使用正则表达式:
s1.replacingOccurrences(of: "[0-9]\\) ", with: "", options: .regularExpression)
print(s1) // prints "Do this thing"
答案 2 :(得分:0)
使用正则表达式。
let s1 = "1) Do this thing"
let s2 = "201) Do that thing"
func stripNumber(_ s:String) -> String? {
let reg = try! NSRegularExpression(pattern: "^\\d+\\) ")
if let tm = reg.firstMatch(in: s, range:NSMakeRange(0,s.utf16.count)) {
return (s as NSString).substring(from: tm.range.length)
}
return nil
}
print(stripNumber(s1)!) // Do this thing
print(stripNumber(s2)!) // Do that thing