@daiyam/regexp
v0.2.3
Published
RegExp parser/formatter/visitor/transformer
Downloads
16
Maintainers
Readme
@daiyam/regexp
With @daiyam/regexp
, you can parse a regular expression to get an AST. Then you can visit, transform or/and translate the ast. When you have finished your edits, you can stringify the AST to get a string to create a RegExp
.
Getting Started
With node previously installed:
npm install @daiyam/regexp
import { escape, parse, stringify, translate, visit, Flavor, Token, TokenType } from '@daiyam/regexp'
function listCaptureGroups(regex: string): Token[] {
const ast = parse(regex);
const groups: Token[] = [];
visit(ast.body, {
[TokenType.CAPTURE_GROUP](token) {
groups.push(token);
}
});
return groups;
}
function toES2018(source: string): RegExp {
return new RegExp(translate(source, Flavor.ES2018));
}
Syntax
The library is supporting ES2018 syntax and some elements of PCRE2 syntax.
| Characters / constructs | Corresponding article |
| ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| \
, .
, \cX
, \d
, \D
, \f
, \n
, \r
, \s
, \S
, \t
, \v
, \w
, \W
, \0
, \xhh
, \uhhhh
, \uhhhhh
, [\b]
| Character classes (MDN) |
| ^
, $
, x(?=y)
, x(?!y)
, (?<=y)x
, (?<!y)x
, \b
, \B
| Assertions (MDN) |
| (x)
, (?:x)
, (?<Name>x)
, x\|y
, [xyz]
, [^xyz]
, \Number
| Groups and ranges (MDN) |
| *
, +
, ?
, x{n}
, x{n,}
, x{n,m}
| Quantifiers (MDN) |
| \p{UnicodeProperty}
, \P{UnicodeProperty}
| Unicode property escapes (MDN |
| (?imsxUJX-imsxUJX)x
, (?i:x)y
| Option Setting (PCRE) |
API
parse(value: string | RegExp) => Token
with interface Token
, parse the value
to generate an AST tree.
stringify(tokens?: Token | Token[] | RegExp) => string
generate a string based on the given AST tokens.
visit(tokens?: Token | Token[], callback?: { [TokenType: string]: Visitor } | Visitor) => void
with type Visitor = (token: Token) => void
, call the callback
when iterating the given AST tokens
transform(tokens?: Token | Token[], callback?: { [TokenType: string]: Transformer } | Transformer) => void
with type Transformer = (token: Token, parent: Token | null, key: string | null, index: number | null) => void
, call the callback
when iterating the given AST tokens.
The this
context of the callback
with have the following functions:
this.remove() => void
: remove the current tokenthis.replace(token: string | Token | Token[], transform?: boolean) => void
: replace the current token with the given token(s). Iftransform
is true, then the new token(s) are going to be transformed.this.transform(tokens: Token | Token[], parent?: Token, key?: string) => void
: run the tranformation on the given token(s).
translate(value: string | RegExp | Token | Token[], target: Flavor, toString?: boolean = true) => string | Token | Token[]
translate a regex for the target
regexp language.
function toES2018(source: string): RegExp {
return new RegExp(translate(source, Flavor.ES2018));
}
| Supported Flavors |
| ----------------- |
| ES2018
|
escape(value: string) => string
escape the RegExp special characters from the value
.
isRegExp(value: any) => boolean
determine if the value
is a RexExp or not.
License
Copyright © 2021 Baptiste Augrain
Licensed under the MIT license.