Files
kumomta/docs/reference/regex/compile.md
T
Wez Furlong 42bf5c5e61 docs: adjust reference to improve search terms
We've been hoping that mkdocs-material will ship the much anticipated
search enhancements for some time, but it's time to recognize that
we need to do something to improve the search results with how
things work right now.

This is a big commit that changes the titles of the various pages
from the code-annotated synopsis to just the name of the function.

This makes it much easier now to match things like `kumo.reject`
directly, but `reject` remains awkward to find.

I think this is the best that we can do at this time.

A few functions have been annotated with the `status: deprecated` to
show as deprecated in the toc/nav (shows with a little trash can next
to the name).
2025-05-16 14:02:19 -07:00

154 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# kumo.regex.compile
```lua
kumo.regex.compile(PATTERN)
```
{{since('2024.09.02-c5476b89')}}
Compiles the regular expression `PATTERN`.
The supported syntax is [described in the Rust regex crate
documentation](https://docs.rs/regex/latest/regex/index.html#syntax), augmented
by [fancy regex
extensions](https://docs.rs/fancy-regex/latest/fancy_regex/#syntax), and is
similar to Perl-Compatible Regex, with a few differences.
!!! note
In lua string literals backslash **must always** be escaped by a backslash,
so you will need to write `\\` in cases where in other languages you
might have been able to get away with just a single backslash.
The return from this function is a `Regex` object that has the following
methods:
## regex:captures(HAYSTACK)
Searches for the first match of this regex in the haystack given, and if found,
returns a table keyed by the captures defined in the regex. Index 0 corresponds
to the full match. Each subsequent capture group is indexed by the order of its
opening `(`.
```lua
local re = kumo.regex.compile "'([^']+)'\\s+\\((\\d{4})\\)"
local cap = re:captures "Not my favorite movie: 'Citizen Kane' (1941)."
assert(cap[0] == "'Citizen Kane' (1941)")
assert(cap[1] == 'Citizen Kane')
assert(cap[2] == '1941')
```
Named capture groups are also supported; in addition to the numeric indices
described above, if you have used a named capture group, you can also index
the result by its name:
```lua
local re = kumo.regex.compile "'(?<title>[^']+)'\\s+\\((?<year>\\d{4})\\)"
local cap = re:captures "Not my favorite movie: 'Citizen Kane' (1941)."
assert(cap[0] == "'Citizen Kane' (1941)")
assert(cap.title == 'Citizen Kane')
assert(cap.year == '1941')
```
## regex:is_match(HAYSTACK)
Returns true if and only if there is a match for the regex anywhere in the
haystack given.
It is recommended to use this method if all you need to do is test whether a
match exists, since the underlying matching engine may be able to do less work.
```lua
local re = kumo.regex.compile 'oo'
assert(re:is_match 'foo')
```
## regex:find(HAYSTACK)
Searches for the first match of this regex in the haystack given, and if found,
returns it as a string.
```lua
local re = kumo.regex.compile 'o+'
assert(re:find 'food' == 'oo')
assert(re:find 'fooood' == 'oooo')
```
## regex:find_all(HAYSTACK)
Searchs for successive non-overlapping matches in the given haystack, returning
the matches as an array-like table of the matching strings.
```lua
local re = kumo.regex.compile '\\b\\w{13}\\b'
local res =
re:find_all 'Retroactively relinquishing remunerations is reprehensible.'
assert(
kumo.json_encode(res)
== '["Retroactively","relinquishing","remunerations","reprehensible"]'
)
```
## regex:replace(TEXT, REPLACEMENT)
Replaces the leftmost-first match with the replacement provided. `$N` and
`$name` in the replacement string are expanded to match capture groups defined
in the regex.
If no match is found, then a copy of the string is returned unchanged.
All instances of `$name` in the replacement text is replaced with the
corresponding capture group name.
`name` may be an integer corresponding to the index of the capture group
(counted by order of opening parenthesis where `0` is the entire match) or it can
be a name (consisting of letters, digits or underscores) corresponding to a
named capture group.
If `name` isnt a valid capture group (whether the name doesnt exist or isnt
a valid index), then it is replaced with the empty string.
The longest possible `name` is used. e.g., `$1a` looks up the capture group
named `1a` and not the capture group at index `1`. To exert more precise
control over the name, use braces, e.g., `${1}a`.
To write a literal `$` use `$$`.
```lua
local re = kumo.regex.compile '[^01]+'
assert(re:replace('1078910', '') == '1010')
```
```lua
local re = kumo.regex.compile '(?P<last>[^,\\s]+),\\s+(?P<first>\\S+)'
assert(
re:replace('Springsteen, Bruce', '$first $last') == 'Bruce Springsteen'
)
```
## regex:replace_all(TEXT, REPLACEMENT)
Replaces all non-overlapping matches in text with the replacement provided.
This is the same as calling `replacen` with `limit` set to `0`.
See the documentation for `replace` for details on how to access capturing
group matches in the replacement string.
## regex:replacen(TEXT, LIMIT, REPLACEMENT)
Replaces at most limit non-overlapping matches in text with the replacement
provided. If limit is `0`, then all non-overlapping matches are replaced.
See the documentation for `replace` for details on how to access capturing
group matches in the replacement string.
## regex:split(TEXT)
Splits `text` by the regex, returning each delimited string in an array-style
table.
```lua
local re = kumo.regex.compile '[ \\t]+'
local res = re:split 'a b \t c\td e'
assert(kumo.json_encode(res) == '["a","b","c","d","e"]')
```