Visual FoxPro
Visual FoxPro
Regular Expression Replace Capture Groups
See more Regular Expressions Examples
Demonstrates replacing capture groups for a regular expression.Note: Chilkat uses PCRE2. See PCRE2 Regular Expressions
Also see: PCRE2 Performance
Chilkat Visual FoxPro Downloads
LOCAL lnSuccess
LOCAL lcSubject
LOCAL lcPattern
LOCAL loSb
LOCAL loJson
LOCAL lnTimeoutMs
LOCAL lnNumMatches
LOCAL lnFirstNameIdx
LOCAL lnLastNameIdx
LOCAL loSbTemp
LOCAL i
lnSuccess = 0
lcSubject = "John Anders, +_+_+ Mary Robins $$$$"
lcPattern = "(?<first>\w+)\s+(?<last>\w+)"
loSb = CreateObject('Chilkat.StringBuilder')
loSb.Append(lcSubject)
loJson = CreateObject('Chilkat.JsonObject')
loJson.EmitCompact = 0
lnTimeoutMs = 2000
lnNumMatches = loSb.RegexMatch(lcPattern,loJson,lnTimeoutMs)
IF (lnNumMatches < 0) THEN
* Probably an error in the regular expression.
* Suggestion: Use AI to help create and/or diagnose regular expressions.
? loSb.LastErrorText
RELEASE loSb
RELEASE loJson
CANCEL
ENDIF
* Examine the matches:
? loJson.Emit()
* There are 2 matches:
* {
* "named": {
* "first": 1,
* "last": 2
* },
* "match": [
* {
* "group": [
* {
* "cap": "John Anders",
* "idx": 0,
* "len": 11
* },
* {
* "cap": "John",
* "idx": 0,
* "len": 4
* },
* {
* "cap": "Anders",
* "idx": 5,
* "len": 6
* }
* ]
* },
* {
* "group": [
* {
* "cap": "Mary Robins",
* "idx": 19,
* "len": 11
* },
* {
* "cap": "Mary",
* "idx": 19,
* "len": 4
* },
* {
* "cap": "Robins",
* "idx": 24,
* "len": 6
* }
* ]
* }
* ]
* }
* To replace capture groups, write code to examine each capture group within
* each match, and provide a replacement string.
* Then call RegexReplace.
* For example, let's capitalize the first names, and add append "on" to the last name.
* After doing replacements, we should get: JOHN Anderson, +_+_+ MARY Robinson $$$$
lnFirstNameIdx = loJson.IntOf("named.first")
lnLastNameIdx = loJson.IntOf("named.last")
loSbTemp = CreateObject('Chilkat.StringBuilder')
i = 0
lnNumMatches = loJson.SizeOfArray("match")
DO WHILE i < lnNumMatches
loJson.I = i
* The replacement string for the first name will be all uppercase.
loJson.J = lnFirstNameIdx
loSbTemp.Clear()
loJson.StringOfSb("match[i].group[j].cap",loSbTemp)
loSbTemp.ToUppercase()
loJson.UpdateSb("match[i].group[j].rep",loSbTemp)
* Append "on" to the last name.
loJson.J = lnLastNameIdx
loSbTemp.Clear()
loJson.StringOfSb("match[i].group[j].cap",loSbTemp)
loSbTemp.Append("on")
loJson.UpdateSb("match[i].group[j].rep",loSbTemp)
i = i + 1
ENDDO
* The JSON now has replacement strings:
? loJson.Emit()
* {
* "named": {
* "first": 1,
* "last": 2
* },
* "match": [
* {
* "group": [
* {
* "cap": "John Anders",
* "idx": 0,
* "len": 11
* },
* {
* "cap": "John",
* "idx": 0,
* "len": 4,
* "rep": "JOHN"
* },
* {
* "cap": "Anders",
* "idx": 5,
* "len": 6,
* "rep": "Anderson"
* }
* ]
* },
* {
* "group": [
* {
* "cap": "Mary Robins",
* "idx": 19,
* "len": 11
* },
* {
* "cap": "Mary",
* "idx": 19,
* "len": 4,
* "rep": "MARY"
* },
* {
* "cap": "Robins",
* "idx": 24,
* "len": 6,
* "rep": "Robinson"
* }
* ]
* }
* ]
* }
* Call RegexReplace to update the StringBuilder with the replacements.
lnSuccess = loSb.RegexReplace(loJson)
IF (lnSuccess = 0) THEN
? loSb.LastErrorText
RELEASE loSb
RELEASE loJson
RELEASE loSbTemp
CANCEL
ENDIF
? "Result after doing replacements:"
? loSb.GetAsString()
* Result after doing replacements:
* JOHN Anderson, +_+_+ MARY Robinson $$$$
RELEASE loSb
RELEASE loJson
RELEASE loSbTemp