Sample code for 30+ languages & platforms
PureBasic

Regular Expression with Multiple Matches and Capture Groups

See more Regular Expressions Examples

Demonstrates a regular expression with multiple matches and capture groups for each match.

Note: Chilkat uses PCRE2. See PCRE2 Regular Expressions
Also see: PCRE2 Performance

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkJsonObject.pb"

Procedure ChilkatExample()

    success.i = 0

    pattern.s = "Name:\s+(\w+)\s+(\w+),\s+Email:\s+(\S+)"

    sb.i = CkStringBuilder::ckCreate()
    If sb.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    crlf.i = 1
    CkStringBuilder::ckAppendLine(sb,"Name: John Smith, Email: john.smith@example.com",crlf)
    CkStringBuilder::ckAppendLine(sb,"Name: Jack Johnson, Email: jack.johnson@example.com",crlf)
    CkStringBuilder::ckAppendLine(sb,"Name: Mary Adams, Email: mary.adams@example.com",crlf)

    Debug CkStringBuilder::ckGetAsString(sb)

    ; We have the following string:
    ; Name: John Smith, Email: john.smith@example.com
    ; Name: Jack Johnson, Email: jack.johnson@example.com
    ; Name: Mary Adams, Email: mary.adams@example.com

    json.i = CkJsonObject::ckCreate()
    If json.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::setCkEmitCompact(json, 0)

    timeoutMs.i = 2000
    numMatches.i = CkStringBuilder::ckRegexMatch(sb,pattern,json,timeoutMs)
    If numMatches < 0
        ; Probably an error in the regular expression.
        ; Suggestion: Use AI to help create and/or diagnose regular expressions.
        Debug CkStringBuilder::ckLastErrorText(sb)
        CkStringBuilder::ckDispose(sb)
        CkJsonObject::ckDispose(json)
        ProcedureReturn
    EndIf

    ; Examine the matches:
    Debug CkJsonObject::ckEmit(json)

    ; This is the JSON with the match information.
    ; See the JSON parsing code below to get the matched capture group values.

    ; {
    ;   "match": [
    ;     {
    ;       "group": [
    ;         {
    ;           "cap": "Name: John Smith, Email: john.smith@example.com",
    ;           "idx": 0,
    ;           "len": 47
    ;         },
    ;         {
    ;           "cap": "John",
    ;           "idx": 6,
    ;           "len": 4
    ;         },
    ;         {
    ;           "cap": "Smith",
    ;           "idx": 11,
    ;           "len": 5
    ;         },
    ;         {
    ;           "cap": "john.smith@example.com",
    ;           "idx": 25,
    ;           "len": 22
    ;         }
    ;       ]
    ;     },
    ;     {
    ;       "group": [
    ;         {
    ;           "cap": "Name: Jack Johnson, Email: jack.johnson@example.com",
    ;           "idx": 49,
    ;           "len": 51
    ;         },
    ;         {
    ;           "cap": "Jack",
    ;           "idx": 55,
    ;           "len": 4
    ;         },
    ;         {
    ;           "cap": "Johnson",
    ;           "idx": 60,
    ;           "len": 7
    ;         },
    ;         {
    ;           "cap": "jack.johnson@example.com",
    ;           "idx": 76,
    ;           "len": 24
    ;         }
    ;       ]
    ;     },
    ;     {
    ;       "group": [
    ;         {
    ;           "cap": "Name: Mary Adams, Email: mary.adams@example.com",
    ;           "idx": 102,
    ;           "len": 47
    ;         },
    ;         {
    ;           "cap": "Mary",
    ;           "idx": 108,
    ;           "len": 4
    ;         },
    ;         {
    ;           "cap": "Adams",
    ;           "idx": 113,
    ;           "len": 5
    ;         },
    ;         {
    ;           "cap": "mary.adams@example.com",
    ;           "idx": 127,
    ;           "len": 22
    ;         }
    ;       ]
    ;     }
    ;   ]
    ; }

    ; Important:  Capture group 0 always contains the entire match — that is, the portion of the input string that matches the full regular expression.

    cap.s
    i.i = 0
    matchCount.i = CkJsonObject::ckSizeOfArray(json,"match")
    While i < matchCount
        Debug "Match " + Str(i + 1) + ":"
        CkJsonObject::setCkI(json, i)
        j.i = 0
        numCaptureGroups.i = CkJsonObject::ckSizeOfArray(json,"match[i].group")
        While j < numCaptureGroups
            CkJsonObject::setCkJ(json, j)
            cap = CkJsonObject::ckStringOf(json,"match[i].group[j].cap")
            Debug Str(j) + ": " + cap
            j = j + 1
        Wend
        i = i + 1
    Wend

    ; Capture group 0 always contains the entire match — that is, the portion of the input string that matches the full regular expression.

    ; Output

    ; Match 1:
    ; 0: Name: John Smith, Email: john.smith@example.com
    ; 1: John
    ; 2: Smith
    ; 3: john.smith@example.com
    ; Match 2:
    ; 0: Name: Jack Johnson, Email: jack.johnson@example.com
    ; 1: Jack
    ; 2: Johnson
    ; 3: jack.johnson@example.com
    ; Match 3:
    ; 0: Name: Mary Adams, Email: mary.adams@example.com
    ; 1: Mary
    ; 2: Adams
    ; 3: mary.adams@example.co


    CkStringBuilder::ckDispose(sb)
    CkJsonObject::ckDispose(json)


    ProcedureReturn
EndProcedure