Elxr (List expressions)
Regular expression-like syntax for list operations. An experiment generalizing regex-like operations to a list.
Install
To install the latest stable version of elxr -
yarn add elxr
// OR
npm install --save elxr
Syntax
Whitespaces are ignored (except within literals)
-
\s
=> Any string -
\n
=> Any number -
\b
=> Any boolean -
\o
=> Any object (has to be a record) [TODO] -
\a
=> Any array [TODO] -
\T
=> Any truthy value -
\F
=> Any falsey value -
a|b
=> matcha
orb
-
a*
=> Zero or more consecutive instances of patterna
in the list -
a+
=> One or more consecutive instances of patterna
in the list -
a{2, 5}
=> Min-Max quantifiers (example matchesa
more than 2 times but less than 5) -
(\s\T)
=> Group (example matches any non-empty string) -
^a$
=>^
indicates start of list, and$
indicates end of list [TODO] -
a,b
=> matcha
on current item followed byb
on the next item (sequence) -
[name \s\T]
=> match property of object (example matches items with propertyname
as non-empty string) -
> n
|>= n
|< n
|<= n
=> Comparison with literal number [TODO] -
/pat/
=> Test string values against regex -
"foobar"
=> String literal (example matches the stringfoobar
) -
-2.05
=> Number literal (example matches the number-2.05
) -
true
=> Boolean literal (example matches the valuetrue
) -
(?<myMatch> \s\T)
=> Named capture group (example matches\s\T
pattern with the namemyMatch
) [TODO] -
(?: \s\T)
=> Non-capturing group (example checks for\s\T
but doesn't return it as a match) [TODO]
Examples
matchAll
// | Match for any number or any non-empty string or any object with `prop` is true
matchAll(/ \n | \s\T /, [null, 23, '', 'wow', false ]
// > {
// groups: [
// { index: 1, value: 23 }, // \n
// { index: 3, value: 'wow' }, // \s\T
// ]
// }
// | Match for property `seperator` true, followed by one or more list of id's that are non-empty strings
matchAll(/ [seperator true], [id \s\T]+ /, [
{ seperator: true },
{ id: '1' },
{ id: '2' },
{ id: '3' },
{ seperator: true },
{ id: '4' },
{ id: '5' },
{ id: '6' },
])
// > {
// groups: [
// {
// index: 0,
// value: [
// [{ value: { seperator: true }, index: 0 }],
// [{ value: [{ id: '1' }, { id: '2' }, { id: '3' }], index: 1 }],
// ],
// },
// {
// index: 4,
// value: [
// [{ value: { seperator: true }, index: 4 }],
// [{ value: [{ id: '4' }, { id: '5' }, { id: '6' }], index: 5 }],
// ],
// },
// ]
// }
replaceAll
// | Match for any number or any non-empty string or any object with `prop` is true
const replacer = (_, matches) => matches.value.reduce((a, b) => a + b, 0)
replaceAll(/ \n+ /, replacer, [ 'start', 3, 5, 'mid', 2, 0, 4, 'end' ])
// > [ 'start', 8, 'mid', 6, 'end' ]
License
Elxr is licensed under MIT