2016-05-25 21 views
3

Problem: Numerisch ist von unterschiedlicher Länge könnte 1, 200, 1000, 39 99995 usw. sein Und müssen mit einem Text ersetzen z. "Apple" unterscheidet sich von den numerischen Werten.Ersetzen numerische von unterschiedlicher Länge in einer Zeichenfolge mit unterschiedlicher Textlänge

let str: String = "Hallo Ich habe 1313 Objekt von 10 String-Klasse mit 1 Objekt, ähnlich wie 9999 Fehler"

Erwartetes Ergebnis = „Hallo, ich habe Apple- Objekt von Apple- String-Klasse mit Apple- Objekt, ähnlich wie Apple- Fehler“

ich mit folgendem Code versucht:

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: "") 
    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) 

Antwort

0

Swift 2

NSScanner ist groß, aber wenn man eine einfachere Lösung für diese Aufgabe wollen, könnten Sie componentsSeparatedByString, map, Int() und joinWithSeparator wie folgt verwenden:

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) 

Drucke:

hallo ich habe Apple-Objekt von Apple String-Klasse mit Apple-Objekt, ähnlich Apple-Fehler

Es gibt auch eine kurze Version für die Abbildung:

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

Swift 3

componentsSeparatedByString(_:) jetzt components(separatedBy:) und joinWithSeparator(_:) ist jetzt joined(separator:).

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

Wenn ein numerische mit Sonderzeichen wie 10% zugeordnet ist, dann wird dies nicht dieses –

+0

Ja ändern, weil „10%“ kein numerisches Zeichen ist, ist es alphanumerical, und so betrachtet wie ein Faden. Meine Antwort funktioniert durch Trennung von Wörtern mit Leerzeichen - wenn Sie "10%" durch "Apple%" ersetzen möchten, funktioniert meine Antwort nicht mehr *, da dies nicht das ist, was Sie ursprünglich gefragt haben *, Ihre ursprüngliche Frage betraf nur numerische Zeichen . :) Wenn ich über diese Anforderung gewusst hätte, hätte ich meine Antwort nicht gleich gemacht. Wenn Sie wirklich "10%" durch "Apple%" ersetzen müssen, schlage ich vor, dass Sie eine neue Frage mit dieser expliziten Anforderung erstellen (und diese Q & A in der neuen Frage für Informationen referenzieren). – Moritz

-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)