Lua Requires Chilkat v11.1.0+
Lua
Regular Expression with Multiple Matches and Named Capture Groups
See more Regular Expressions Examples
Demonstrates regular expressions with named capture groups and multiple matches.Chilkat Lua Downloads
local chilkat = require("chilkat")
local success = false
local sb = chilkat.StringBuilder.new()
local crlf = true
sb:append_line("Name: John Smith", crlf)
sb:append_line("Name: Jack Johnson", crlf)
sb:append_line("Name: Mary Adams", crlf)
print(sb:get_as_string())
-- We have the following string:
-- Name: John Smith
-- Name: Jack Johnson
-- Name: Mary Adams
local pattern = "Name:\\s+(?<first>\\w+)\\s+(?<last>\\w+)"
local json = chilkat.JsonObject.new()
json.emit_compact = false
local timeoutMs = 2000
local numMatches = sb:regex_match(pattern, json, timeoutMs)
if numMatches < 0 then
-- Probably an error in the regular expression.
-- Suggestion: Use AI to help create and/or diagnose regular expressions.
print(sb.last_error_text)
return
end
-- Examine the matches:
print(json:emit())
-- Here is the JSON showing the matches.
-- Important: Capture group 0 always contains the entire match — that is, the portion of the input string that matches the full regular expression.
-- {
-- "named": {
-- "first": 1,
-- "last": 2
-- },
-- "match": [
-- {
-- "group": [
-- {
-- "cap": "Name: John Smith",
-- "idx": 0,
-- "len": 16
-- },
-- {
-- "cap": "John",
-- "idx": 6,
-- "len": 4
-- },
-- {
-- "cap": "Smith",
-- "idx": 11,
-- "len": 5
-- }
-- ]
-- },
-- {
-- "group": [
-- {
-- "cap": "Name: Jack Johnson",
-- "idx": 18,
-- "len": 18
-- },
-- {
-- "cap": "Jack",
-- "idx": 24,
-- "len": 4
-- },
-- {
-- "cap": "Johnson",
-- "idx": 29,
-- "len": 7
-- }
-- ]
-- },
-- {
-- "group": [
-- {
-- "cap": "Name: Mary Adams",
-- "idx": 38,
-- "len": 16
-- },
-- {
-- "cap": "Mary",
-- "idx": 44,
-- "len": 4
-- },
-- {
-- "cap": "Adams",
-- "idx": 49,
-- "len": 5
-- }
-- ]
-- }
-- ]
-- }
-- The capture group index is obtained by looking up the name in the JSON result.
-- For example:
local idx_first = json:int_of("named.first")
local idx_last = json:int_of("named.last")
local i = 0
local matchCount = json:size_of_array("match")
while i < matchCount do
print("Match " .. (i + 1) .. ":")
json.i = i
json.j = idx_first
print("first: " .. json:string_of("match[i].group[j].cap"))
json.j = idx_last
print("first: " .. json:string_of("match[i].group[j].cap"))
print("")
i = i + 1
end
-- Output is:
-- Match 1:
-- first: John
-- first: Smith
--
-- Match 2:
-- first: Jack
-- first: Johnson
--
-- Match 3:
-- first: Mary
-- first: Adams