2016-05-25 6 views
3

問題:数字の長さは、1,200,100,39,99995などさまざまです。テキストなどで置き換える必要があります。 "Apple"は数値との相違点が異なる。異なる長さの数値を異なる文字列の文字列に置き換えます。

LET列str:文字列=「こんにちは9999個のエラーに似て1つのオブジェクトと10文字列クラスの持っている1313オブジェクト、」

期待される結果=「こんにちは私はアップル文字列クラスのアップルオブジェクトを持っています

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) 
:私は以下のコードで試してみました

アップルエラー」に似アップルオブジェクト、

答えて

0

スウィフト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オブジェクトを持って

マッピング用のショートバージョンもあります:

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

はスウィフト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: " ") 
+0

数値が「10%」は数字ではないので、それは英数字であり、したがって同様に考えられ、そして、これははい、この1 –

+0

は変更されません、10%などの特殊文字に関連付けられている場合文字列。私の答えはスペースで単語を区切って動作します - あなたが "Apple%"で "10%"を置き換えたい場合、私の答えはもはや働かない*これはあなたがもともと尋ねたものではないので* 。 :)もし私がこの要件について知っていたら、私は同じ答えをしていないでしょう。 「10%」を「Apple%」で置き換える必要がある場合は、この明示的な要件で新しい質問を作成することをお勧めします(情報の新しい質問でこのQ&Aを参照してください)。 – 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) 
関連する問題