2016-04-11 15 views
1

ich diesen Text habe, in dem ich brauche nur die Ziffern in der ersten ZeileRegex Rückkehr nur Ziffern bis zu einer neuen Zeile Zeichen

+1-415-655-0001 US TOLL Access code: 197 703 792

die Regex i extrahiert haben zu extrahieren nur alle Ziffern /d+

var noteStr = "1-415-655-0001 US TOLL\n\nAccess code: 197 703 792" 

findCodeInWord() 

func findCodeInWord() -> String? 
{ 
    let regex = try! NSRegularExpression(pattern: "\\d+", options: []) 

    var items = [String]() 
    regex.enumerateMatchesInString(noteStr, options: [], range: NSMakeRange(0, noteStr.characters.count)) { result, flag, stop in 
     guard let match = result else { 
      // result is nil 
      return 
     } 

     let range = match.rangeAtIndex(0) 
     var matchStr = (noteStr as NSString).substringWithRange(range) 
     print(matchStr) 
    } 
    return items.joinWithSeparator("") 

} 

aber dies gibt alle Ziffern zurück. Ich will es nur zurück 14156550001

+0

Verwenden '[^ 0-9] +' als Regex und den Ersatz-String als leer. Ich kenne Swift nicht, aber anscheinend gibt es eine Funktion dafür. Siehe http://stackoverflow.com/questions/28503449/swift-replace-substring-regex – shawnt00

Antwort

1

Sie diese Zahlen mit einem einzigen regex basiert auf einem \G Operator extrahieren und die Erfassung der Ziffern in Gruppe 1:

\G(?:[^\d\n\r]*(\d+)) 

Sehen Sie die regex demo, wird es nur in Gruppe 1 Ziffernfolgen (1 oder mehr, mit (\d+)), die in der ersten Zeile aufgrund \G Operator, die am Anfang der Zeichenfolge und dann am Ende jedes succe übereinstimmt erfassen ssful Übereinstimmung und die [^\d\n\r]* Zeichenklasse, die 0+ Zeichen anders als Ziffer, LF oder CR zusammenbringt.

So, wenn es passend beginnt, 1 gefunden und gefangen genommen, dann - mit [^\d\n\r]* abgestimmt ist, dann wird 415 angepasst und erfasst usw. Wenn \n angetroffen wird, nicht mehr Übereinstimmung gefunden wird, die \G Anker ausfällt und somit , stoppt die gesamte Regex-Suche in der ersten Zeile.

Swift:

let regex = try! NSRegularExpression(pattern: "\\G(?:[^\\d\n\r]*(\\d+))", options: []) 
... 
let range = match.rangeAtIndex(1) 
+1

Danke, Wiktor! Das war genau das, wonach ich suchte. +1 für die Erklärung. Sehr hilfreich! – Tony

1

„Ich habe diesen Text, in dem ich nur die Ziffern in der ersten Zeile extrahieren müssen“

Während regex manchmal sehr nützlich ist, für ein einfache Aufgabe wie nur Zahlen aus einer gegebenen Zeichenfolge extrahieren, Swifts native pattern matching ist ein nützliches Werkzeug; falls hier als UnicodeScalar Darstellung von Zahlen 0 durch 9 ist in Folge:

var noteStr = "1-415-655-0001 US TOLL\n\nAccess code: 197 703 792" 

/* since we're using native pattern matching, let's use a native method 
    also when extracting the first row (even if this is somewhat simpler 
    if using Foundation bridged NSString methods)       */ 
if let firstRowChars = noteStr.characters.split("\n").first, 
    case let firstRow = String(firstRowChars) { 

    // pattern matching for number characters 
    let pattern = UnicodeScalar("0")..."9" 
    let numbers = firstRow.unicodeScalars 
     .filter { pattern ~= $0 } 
     .reduce("") { String($0) + String($1) } 

    print(numbers) // 14156550001 

    /* Alternatively use .reduce with an inline if clause directly: 
    let numbers = firstRow.unicodeScalars 
     .reduce("") { pattern ~= $1 ? String($0) + String($1) : String($0)} */ 
} 
Verwandte Themen