2015-04-01 3 views
0

У меня есть оператор регулярного выражения с несколькими группами захвата, которые разделены | оператор. Как узнать, какая группа захвата совпадает? Единственный способ, который я могу придумать для этого примера, - подсчитывать количество символов, если что-то сопоставляется.Как найти, какая группа сопоставляется в NSRegularExpression

var string = "1234567897" 
var pattern = "(^\\d{9}$)|(^\\d{10}$)|(^\\d{13}$)|(^[a-zA-Z]{2}\\d{9}[a-zA-Z]{2}$)" 

var myRegex = NSRegularExpression(pattern: pattern, options: nil, error: nil)! 

if let myMatch = myRegex.firstMatchInString(string, options: nil, 
    range: NSRange(location: 0, length: string.utf16Count)) { 
     println((string as NSString).substringWithRange(myMatch.rangeAtIndex(0))) 

} 

ответ

2

Я написал код, который работал для моего примера. Я уверен, что это может быть написано лучше, но сейчас это работает.

Свифта 2,3

var string = "123456789" 
var pattern = "(^\\d{9}$)|(^\\d{10}$)|(^\\d{13}$)|(^[a-zA-Z]{2}\\d{9}[wW]{2}$)" 

var myRegex = try! NSRegularExpression(pattern: pattern, options: []) 

if let myMatch = myRegex.firstMatchInString(string, options: NSMatchingOptions.init(rawValue: 0), range: NSRange(location: 0, length: string.utf16.count)) { 
    var matchedGroup = 0 

    for var i in 1..<myMatch.numberOfRanges { 
     if myMatch.rangeAtIndex(i).length != 0 { 
      matchedGroup = i 
      break 
     } 

    } 
    print(matchedGroup) 
    print((string as NSString).substringWithRange(myMatch.rangeAtIndex(0))) //whatever the range you want to print 

} 

Свифта 3

var string = "123456789" 
var pattern = "(^\\d{9}$)|(^\\d{10}$)|(^\\d{13}$)|(^[a-zA-Z]{2}\\d{9}[wW]{2}$)" 

var myRegex = try! NSRegularExpression(pattern: pattern, options: []) 

if let myMatch = myRegex.firstMatch(in: string, options: NSRegularExpression.MatchingOptions.init(rawValue: 0), range: NSRange(location: 0, length: string.utf16.count)) { 
    var matchedGroup = 0 

    for var i in 1..<myMatch.numberOfRanges { 
     if myMatch.rangeAt(i).length != 0 { 
      matchedGroup = i 
      break 
     } 

    } 
    print(matchedGroup) 
    print((string as NSString).substring(with: myMatch.rangeAt(0))) //whatever the range you want to print 

}