Idio uses the POSIX regex(7) regular expression primitives regcomp and regexec.

You can use them directly or commonly in variations on the case expression.

regcomp defaults to REG_EXTENDED so there is an additional REG_BASIC flag to disable REG_EXTENDED.

regexec has an extra REG_VERBOSE flag where the elements in the results array are lists of the matched sub-expression, its starting offset and ending offset (suitable for substring).


regex-case which works like a simplified case except the clause “conditions” are regular expressions to be matched.

If the regular expression matches, regex-case then supplies the consequent expression with the result of the call to regexec as the variable r, an array. r.0 is the whole of the matched string, r.1 is the first matched sub-expression, r.2 the second matched sub-expression, etc..

 ("^([[:alpha:]][[:alnum:]_]*)=(.*)" {
   printf "%s is '%s'\n" r.1 r.2
 (else {
   printf "no match\n"

Here we need to input a line for read-line:

$ idio simple-regex-case
foo is 'bar'


Similarly, pattern-case provides something like the shell’s case statement’s Pattern Matching where * and ? are really .* and . respectively.

Note that your pattern string is implicitly anchored to the start and end.

for try in '(1 2 3 4) {
   ("foo*" {
     printf "%s is foo-ish\n" r.0
   ("bar?" {
     printf "%s is bar-ish\n" r.0
   (else {
     printf "no match\n"

Four lines of input, this time:

$ idio simple-pattern-case
foo diddly-dee do
foo diddly-dee do is foo-ish
I'm feeling foo
no match
barb is bar-ish
no match

Last built at 2023-11-09T07:11:45Z+0000 from 77077af (dev) for Idio 0.3