0.0.3 • Published 2 years ago
elxr v0.0.3
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 valuea|b
=> matcha
orb
a*
=> Zero or more consecutive instances of patterna
in the lista+
=> One or more consecutive instances of patterna
in the lista{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 TODOa,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