Search code examples
regexswiftswift3

Swift 3 - How do I extract captured groups in regular expressions?


I am using Swift 3 and trying to access captured groups.

let regexp = "((ALREADY PAID | NOT ALR | PROVIDER MAY | READY | MAY BILL | BILL YOU | PAID)((.|\\n)*))(( \\d+)(\\.+|-+)(\\d\\d))"

// check if some substring is in the recognized text
if let range = stringText.range(of:regexp, options: .regularExpression) {
    let result = tesseract.recognizedText.substring(with:range)
}

I want to be able to extract out the last two numbers captured (\d\d) so if the text was: ALREADY PAID asfasdfadsfasdf 39.15, it would extract 15. Here is a regex builder that shows what I want. Normally, I would be able to do $8 to get the 8th group that was extracted but I don't know how to do that in Swift 3.

http://regexr.com/3fh1e


Solution

  • but I don't know how to do that in Swift 3.

    When you receive a match from NSRegularExpression, what you get is an NSTextCheckingResult. You call rangeAt to get a specific capture group.

    Example:

    let s = "hey ho ha"
    let pattern = "(h).*(h).*(h)"
    // our goal is capture group 3, "h" in "ha"
    let regex = try! NSRegularExpression(pattern: pattern)
    let result = regex.matches(in:s, range:NSMakeRange(0, s.utf16.count))
    let third = result[0].rangeAt(3) // <-- !!
    third.location // 7
    third.length // 1