2014-10-04 3 views
1

Мне нравится менять «Я пробегаю 12 миль» до «Я бегу 24 мили», используя регулярное выражение. «12» может быть любым числом. Я использую функцию «replace2()» для выполнения математической операции. Параметр захвата «$ 1», переданный функции replace2 («$ 1»), прекрасен. Пожалуйста помоги!Swift: математическая операция с номерами для набора регулярных выражений

func replace(str:String, pattern : String, repl:String)->String?{ 
    let regex = NSRegularExpression .regularExpressionWithPattern(pattern, options: nil,error: nil) 
    let replacedString = regex.stringByReplacingMatchesInString(str, options: nil, 
     range: NSMakeRange(0, countElements(str)), withTemplate: repl) 
    return replacedString 

} 
replace("I run 12 miles and walk 12.45 km","\\d+(.\\d+)?", "-")! 

func replace2(x: String)->String { 
    let xx = x.toInt()! * 2  // error : return nil? 
    return String(format: "\(xx)") 
} 
replace("I run 12 miles ","(\\d+)", replace2("$1"))! // error 

ответ

0

Попробуйте в игровой площадке:

let str1: NSString = "I run 12 miles" 
let str2 = "I run 12 miles" 

let match = str1.rangeOfString("\\d+", options: .RegularExpressionSearch) 
let finalStr = str1.substringWithRange(match).toInt() 
let n: Double = 2.2*Double(finalStr!) 

let newStr = str2.stringByReplacingOccurrencesOfString("\\d+", withString: "\(n)", options: NSStringCompareOptions.RegularExpressionSearch, range: nil) 

println(newStr) //I run 26.4 miles 


//or more simply 
let newStr2 = "I run \(n) kilometers" 
//yes, I know my conversion is off 
+0

Спасибо. Он работает. Но я стараюсь, чтобы умножить много (UNKOWN) номера, как –

+0

" Я бегу 34 миль и 10,54 км в -34 градусах градусов ". Мне нравится умножать все 3 числа на 2. –

+0

извините, обновлено выше –

0

Если вы хотите динамически поймать значения и заменить их на основе захваченного значения, вы должны использовать enumerateMatchesInString. Вы можете затем написать цикл, который делает замену:

func stringWithDoubleNumbers(string: String) -> String { 
    // build array of ranges that need replacing 

    var ranges = [NSRange]() 
    let regex = NSRegularExpression(pattern: "[\\d.]+", options: nil, error: nil) as NSRegularExpression 
    regex.enumerateMatchesInString(string, options: nil, range: NSMakeRange(0, countElements(string))) { 
     match, flags, stop in 

     ranges.append(match.range) 
    } 

    var doubledString = NSMutableString(string: string) 

    // iterate backwards so that location is valid despite other replacements 

    for range in reverse(ranges) { 
     let foundString = doubledString.substringWithRange(range) 

     if let value = foundString.toInt() { 
      let numericString = "\(value * 2)" 
      doubledString.replaceCharactersInRange(range, withString: numericString) 
     } else { 
      let value = NSString(string: foundString).doubleValue 
      let numericString = "\(value * 2.0)" 
      doubledString.replaceCharactersInRange(range, withString: numericString) 
     } 
    } 

    return doubledString 
} 

я сделать некоторую дополнительную логику для обработки целочисленных значений иначе, чем с плавающей точкой типа, но вы могли бы упростить это, если вы не хотите, чтобы беспокоиться о том, что осложнения ,

+0

Отлично! Спасибо. –

0

// Я экспериментирую с кодами Стива и Роба выше, я думаю, что могу получить коды для решения проблемы для простой строки. У меня все еще проблема с сложной строкой. Я пытаюсь проанализировать запись данных с различными множественными (-20) числами с целыми/двойными значениями не в любой последовательности, как обработка как str2, так и str3 в одной процедуре. В любом случае спасибо Стиву и Робу.

let str2 = "I run 89 miles and 28.576 km" 
let str3 = "I run 89.45 miles and 34 km in 34F degree" 

var re = NSRegularExpression(pattern: "(\\d+).* (\\d+\\.\\d+)", options: nil, error: nil) 
var match = re.firstMatchInString(str2, options: nil, range: NSMakeRange(0, countElements(str2))) 

var startIndex = advance(str2.startIndex, match.rangeAtIndex(1).location) 
var endIndex = advance(str2.startIndex, match.rangeAtIndex(1).location + match.rangeAtIndex(1).length) 
let x1 = str2.substringWithRange(Range(start: startIndex, end: endIndex)).toInt()! 

x1

startIndex = advance(str2.startIndex, match.rangeAtIndex(2).location) 
endIndex = advance(str2.startIndex, match.rangeAtIndex(2).location + match.rangeAtIndex(2).length) 
let x2 = str2.substringWithRange(Range(start: startIndex, end: endIndex)) 
let x2x = NSString(string: x2).doubleValue 
let n1 = x1 * 2 
let n2: Double = 2.0 * x2x 

str2.stringByReplacingOccurrencesOfString("(\\d+)(.*)(\\d+\\.\\d+)", withString: "\(n1)$2\(n2)", options: NSStringCompareOptions.RegularExpressionSearch, range: nil) 

// Я бегу 178 миль и 57.152 км "