Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: added some samples

Regular expressions are enclosed in matching pound sign (#) characters with a prepended re: re#...#. KRL regular expressions follow the JavaScript standard, which closely follows the conventions for Perl regular expressions. The following modifiers may appear in any order after the closing character:

...

KRL uses the hash character to delimit regular expressions instead of the more common (and acceptable) slash (/) because the slash is a frequently used character in URL paths. This removes the need to quote the slash with backslashes: re/\/archives\/\d{4}\//. Using an alternate delimiter makes the regex more readable and thus communicates its meaning more clearly: re#/archives/\d{4}/#.

Samples

Some regular expressions found in KRL code "in the wild".

timestamp

Code Block
select when d1 t1 time re#^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[.]\d{3}Z)$# setting(timestamp)

The regular expression above matches a string such as produced by the time:now() function in the time library. Notice that it expects the string to consist entirely, from beginning (^) to end ($) of an ISO8601 time string and furthermore, that string is captured (note the surrounding pair of parentheses). In this context, a rule controlled by the event expression shown above would be selected when an incoming event had domain d1, type t1, and an event attribute named "time" which satisfied the ISO8601 pattern specified by the regular expression. Within the rest of the rule the validated value will be available as the value bound to the name timestamp.

ECI

Code Block
re#^[A-Za-z0-9]{21,22}$#

The regular expression above matches an event channel identifier, which in the Node.js pico engine is a distributed identifier or DID.

non-negative integer

Code Block
re#^(\d+)$#

non-empty string of characters

Code Block
re#(.+)#

a literal decimal point

Code Block
re#[.]#

This appeared in a function to compute the integer part of a non-negative value which might contain a decimal point:

Code Block
      math_int = function(num) {
        val = num.as("String");
        dec = val.match(re#[.]#);
        dec => val.extract(re#(\d*)[.]\d*#)[0].as("Number") | num;
      }
...
      tens = math_int( x / 10 )

The function uses the string operator extract to isolate the numerator from the number computed as x / 10.