UNPKG

@daiyam/regexp

Version:

RegExp parser/formatter/visitor/transformer

104 lines (68 loc) 5.29 kB
[@daiyam/regexp](https://github.com/daiyam/node-regexp) ====================================================================== [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE) [![NPM Version](https://img.shields.io/npm/v/@daiyam/regexp.svg?colorB=green)](https://www.npmjs.com/package/@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](http://nodejs.org) previously installed: npm install @daiyam/regexp ```typescript 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)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Character_Classes) | | `^`, `$`, `x(?=y)`, `x(?!y)`, `(?<=y)x`, `(?<!y)x`, `\b`, `\B` | [Assertions (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Assertions) | | `(x)`, `(?:x)`, `(?<Name>x)`, `x\|y`, `[xyz]`, `[^xyz]`, `\Number` | [Groups and ranges (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Groups_and_Ranges) | | `*`, `+`, `?`, `x{n}`, `x{n,}`, `x{n,m}` | [Quantifiers (MDN)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Quantifiers) | | `\p{UnicodeProperty}`, `\P{UnicodeProperty}` | [Unicode property escapes (MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Unicode_Property_Escapes) | | `(?imsxUJX-imsxUJX)x`, `(?i:x)y` | [Option Setting (PCRE)](https://mariadb.com/kb/en/pcre/#option-setting) | 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 token - `this.replace(token: string | Token | Token[], transform?: boolean) => void`: replace the current token with the given token(s). If `transform` 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. ```typescript 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 &copy; 2021 Baptiste Augrain Licensed under the [MIT license](http://www.opensource.org/licenses/mit-license.php).