将字符串中不同长度的数字替换为不同长度的文本

4
问题: 数字的长度可能是1、200、1000、3999995等不同的长度,需要用不同长度的文本(例如“Apple”)替换它们。

let str: String = "hello i have 1313 object of 10 string class with 1 object, similar to 9999 errors"

期望结果 = "hello i have Apple object of Apple string class with Apple object, similar to Apple errors"

我已尝试以下代码:

 var originalString: String = "hello i have 1313 object of 10 string class with 1 object, similar to 9999 errors"

    let strippedString: NSMutableString = NSMutableString(capacity: originalString.characters.count)
    var numArray: [String] = []
    var locArray: [NSNumber] = []
    var scanner: NSScanner = NSScanner(string:originalString)
    let numbers: NSCharacterSet = NSCharacterSet(charactersInString: "0123456789")
    while scanner.atEnd == false {
        var buffer: NSString?
        if scanner.scanCharactersFromSet(numbers, intoString: &buffer) {
            strippedString.appendString(buffer! as String)
            numArray.append(buffer! as String)
            locArray.append(scanner.scanLocation)
        }
        else {

            scanner.scanLocation = (scanner.scanLocation + 1)
        }
    }
    for (index, _) in numArray.enumerate() {
        var loc : Int = Int(locArray[index] ) - (String(numArray[index]).characters.count)
        let len = String(numArray[index]).characters.count
        let dupStr = "Apple"
        if(index != 0 && len !=  dupStr.characters.count)
        {
            loc = loc + (dupStr.characters.count - len) + 1
        }
        originalString.replaceRange(originalString.startIndex.advancedBy(loc)..<originalString.startIndex.advancedBy(loc + len), with: dupStr)
    }
    print(originalString)
2个回答

0

Swift 2

NSScanner很好,但如果你想要一个更简单的解决方案,你可以使用componentsSeparatedByStringmapInt()joinWithSeparator,像这样:

let originalString = "hello i have 1313 object of 10 string class with 1 object, similar to 9999 errors"
let tokens = originalString.componentsSeparatedByString(" ")
let newTokens = tokens.map { (token) -> String in
    if let _ = Int(token) {
        return "Apple"
    }
    return token
}
let result = newTokens.joinWithSeparator(" ")
print(result)

输出:

你好,我有一个Apple字符串类的Apple对象,与Apple错误类似的Apple对象。

还有一个映射的简短版本:

let newTokens = tokens.map { Int($0) != nil ? "Apple" : $0 }

Swift 3

componentsSeparatedByString(_:) 现在是 components(separatedBy:),而 joinWithSeparator(_:) 现在是 joined(separator:)

let tokens = originalString.components(separatedBy: " ")
let newTokens = tokens.map { Int($0) != nil ? "Apple" : $0 }
let result = newTokens.joined(separator: " ")

如果数字与特殊字符(如10%)相关联,则这不会改变它。 - Pankaj Bhardwaj
是的,因为“10%”不是数字字符,它是字母数字字符,因此被视为字符串。我的答案通过用空格分隔单词来工作 - 如果您想用“Apple%”替换“10%”,那么我的答案就不再适用了因为这不是您最初提出的问题,您最初的问题只涉及数字字符。 :)如果我知道这个要求,我就不会做出相同的回答。如果您真的需要用“Apple%”替换“10%”,那么我建议您创建一个新问题,并在新问题中明确说明此要求(并引用此Q&A以获取信息)。 - Eric Aya

-1
var str: String = "hello i have 1313 object of 10 string class with 1 object, similar to 9999 errors"
var comp: [AnyObject] = [AnyObject](array: str.componentsSeparatedByString(" "))
for var i = 0; i < comp.count; i++ {
  var numberRegex: NSRegularExpression = NSRegularExpression.regularExpressionWithPattern("^[0-9]", options: NSRegularExpressionCaseInsensitive, error: nil)
  var regexMatch: Int = numberRegex.numberOfMatchesInString(comp[i], options: 0, range: NSMakeRange(0, (String(comp[i])).length))
    if regexMatch != 0 {
      comp[i] = "Apple"
    }
}
var result: String = comp.componentsJoinedByString(" ")
print(result)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接