2017-12-05 3 views
1

Ich möchte alle 'm' in meinen Saiten durch 'Meter' ersetzen. Das Problem ist, dass ich das richtige Muster finden muss, da es möglich ist, eine Zahl in Kombination mit einem Leerzeichen vor dem Einheitssymbol zu haben.Wie kann ich mit RegularExpressions eine Übereinstimmung basierend auf einem Muster ersetzen, aber den Wert beibehalten?

Ich habe bereits versucht das folgende Muster: [1-9][0-9]*\\s?m": "[1-9][0-9]*\\s?Meter mit dem folgenden Code:

static let patterns = [ 
    "[1-9][0-9]*\\s?m": "[1-9][0-9]*\\s?Meter" 
]; 

static public func prepareText(input: String) -> String { 
    var modifiedInput = input; 

    for pattern in patterns.keys { 
     let regex = try! NSRegularExpression(pattern: pattern, options: .caseInsensitive); 
     modifiedInput = regex.stringByReplacingMatches(
      in: modifiedInput, options: [], range: NSMakeRange(0, modifiedInput.count), 
      withTemplate: patterns[pattern]!); 
    } 

    return modifiedInput; 
} 

Aber ich habe jetzt das Problem, dass der Wert meiner Parameter auch geändert wird:

800 m -> [1-9][0-9]*s?Meter 

Wie also kann Ich behalte die 800 vor dem Einheitssymbol?

Antwort

1

Sie benötigen

static let patterns = [ 
    "([1-9][0-9]*\\s?)m": "$1Meter" 
]; 

Die "([1-9][0-9]*\\s?)m" Muster entsprechen und in Gruppe 1 eine Ziffer 1-9 erfassen wird verwenden, werden alle 0+ Ziffern und dann ein optionales Leerzeichen, dann entspricht nur m. Die $1Meter Ersetzung wird durch den Inhalt der Gruppe 1 ersetzt und dann Meter hinzugefügt.

Wenn Sie sicherstellen müssen die m nicht mit einem Wort char gefolgt wird, verwenden "([1-9][0-9]*\\s?)m\\b" regex (dh, fügen \\b, eine Wortgrenze, nach m).

+1

Vielen Dank für diese wirklich hilfreiche Antwort! Dies ist der richtige Weg! –

Verwandte Themen