在Swift 3中迭代和操作字符串

时间:2016-10-17 23:24:02

标签: swift string indexing

我尝试做的事情应该很简单,但由于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)
}

有更简洁的方法吗?似乎我应该能够删除字符,直到循环找到第一个字母,但是从循环内访问unicodeScalarString.Index已经证明是困难的。

对此功能有任何建议或改进吗?

3 个答案:

答案 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