Super Expressive 是一款零依赖的 JavaScript 库,用于以 (几乎) 自然语言构建正则表达式
Super Expressive 是一款零依赖的 JavaScript 库,用于以 (几乎) 自然语言构建正则表达式
Super Expressive is a JavaScript library that allows you to build regular expressions in almost natural language - with no extra dependencies, and a lightweight code footprint (less than 4kb with minification + gzip!).
Regex is a very powerful tool, but its terse and cryptic vocabulary can make constructing and communicating them with others a challenge. Even developers who understand them well can have trouble reading their own back just a few months later! In addition, they can't be easily created and manipulated in a programmatic way - closing off an entire avenue of dynamic text processing.
That's where Super Expressive comes in. It provides a programmatic and human readable way to create regular expressions. It's API uses the fluent builder pattern, and is completely immutable. It's built to be discoverable and predictable:
SuperExpressive().exactly(5).digit)index.d.ts file for full TypeScript supportSuperExpressive turns those complex and unwieldy regexes that appear in code reviews into something that can be read, understood, and properly reviewed by your peers - and maintained by anyone!
npm i super-expressive
const SuperExpressive = require('super-expressive');
// Or as an ES6 module
import SuperExpressive from 'super-expressive';
The following example recognises and captures the value of a 16-bit hexadecimal number like 0xC0D3.
const SuperExpressive = require('super-expressive');
const myRegex = SuperExpressive()
.startOfInput
.optional.string('0x')
.capture
.exactly(4).anyOf
.range('A', 'F')
.range('a', 'f')
.range('0', '9')
.end()
.end()
.endOfInput
.toRegex();
// Produces the following regular expression:
/^(?:0x)?([A-Fa-f0-9]{4})$/
You can experiment with SuperExpressive in the Super Expressive Playground by @nartc. This is a great way to build a regex description, and test it against various inputs.
Super Expressive has been ported to the following languages:
https://github.com/bassim/super-expressive-php by @bassim
https://github.com/hiy/super-expressive-ruby by @hiy
https://github.com/stanislav-tsaplev/super_expressive by @stanislav-tsaplev
SuperExpressive()
Creates an instance of SuperExpressive.
Uses the g flag on the regular expression, which indicates that it should match multiple values when run on a string.
Example
SuperExpressive()
.allowMultipleMatches
.string('hello')
.toRegex();
// ->
/hello/g
Uses the m flag on the regular expression, which indicates that it should treat the .startOfInput and .endOfInput markers as the start and end of lines.
Example
SuperExpressive()
.lineByLine
.string('^hello$')
.toRegex();
// ->
/\^hello\$/m
Uses the i flag on the regular expression, which indicates that it should treat ignore the uppercase/lowercase distinction when matching.
Example
SuperExpressive()
.caseInsensitive
.string('HELLO')
.toRegex();
// ->
/HELLO/i
Uses the d flag on the regular expression, which indicates that it should generate indices for the start and end of each capture group.
Example
SuperExpressive()
.generateIndices
.string('hello')
.toRegex();
// ->
/hello/d
Uses the y flag on the regular expression, which indicates that it should create a stateful regular expression that can be resumed from the last match.
Example
SuperExpressive()
.sticky
.string('hello')
.toRegex();
// ->
/hello/y
Uses the u flag on the regular expression, which indicates that it should use full unicode matching.
Example
SuperExpressive()
.unicode
.string('héllo')
.toRegex();
// ->
/héllo/u
Uses the s flag on the regular expression, which indicates that the input should be treated as a single line, where the .startOfInput and .endOfInput markers explicitly mark the start and end of input, and .anyChar also matches newlines.
Example
SuperExpressive()
.singleLine
.string('hello')
.anyChar
.string('world')
.toRegex();
// ->
/hello.world/s
Matches any single character. When combined with .singleLine, it also matches newlines.
Example
SuperExpressive()
.anyChar
.toRegex();
// ->
/./
Matches any whitespace character, including the special whitespace characters: \r\n\t\f\v.
Example
SuperExpressive()
.whitespaceChar
.toRegex();
// ->
/\s/
Matches any non-whitespace character, excluding also the special whitespace characters: \r\n\t\f\v.
Example
SuperExpressive()
.nonWhitespaceChar
.toRegex();
// ->
/\S/
Matches any digit from 0-9.
Example
SuperExpressive()
.digit
.toRegex();
// ->
/\d/
Matches any non-digit.
Example
SuperExpressive()
.nonDigit
.toRegex();
// ->
/\D/
Matches any alpha-numeric (a-z, A-Z, 0-9) characters, as well as _.
Example
SuperExpressive()
.word
.toRegex();
// ->
/\w/
Matches any non alpha-numeric (a-z, A-Z, 0-9) characters, excluding _ as well.
Example
SuperExpressive()
.nonWord
.toRegex();
// ->
/\W/
Matches (without consuming any characters) immediately between a character matched by .word and a character not matched by .word (in either order).
Example
SuperExpressive()
.digit
.wordBoundary
.toRegex();
// ->
/\d\b/
Matches (without consuming any characters) at the position between two characters matched by .word.
Example
SuperExpressive()
.digit
.nonWordBoundary
.toRegex();
// ->
/\d\B/
Matches a \n character.
Example
SuperExpressive()
.newline
.toRegex();
// ->
/\n/
Matches a \r character.
Example
SuperExpressive()
.carriageReturn
.toRegex();
// ->
/\r/
Matches a \t character.
Example
SuperExpressive()
.tab
.toRegex();
// ->
/\t/
Matches a \v character.
Example
SuperExpressive()
.verticalTab
.toRegex();
// ->
/\v/
Matches a \f character.
Example
SuperExpressive()
.formFeed
.toRegex();
// ->
/\f/
Matches a \b character.
Example
SuperExpressive()
.backspace
.toRegex();
// ->
/[\b]/
Matches a \u0000 character (ASCII 0).
Example
SuperExpressive()
.nullByte
.toRegex();
// ->
/\0/
Matches a choice between specified elements. Needs to be finalised with .end().
Example
SuperExpressive()
.anyOf
.range('a', 'f')
.range('0', '9')
.string('XXX')
.end()
.toRegex();
// ->
/(?:XXX|[a-f0-9])/
Creates a capture group for the proceeding elements. Needs to be finalised with .end(). Can be later referenced with backreference(index).
Example
SuperExpressive()
.capture
.range('a', 'f')
.range('0', '9')
.string('XXX')
.end()
.toRegex();
// ->
/([a-f][0-9]XXX)/
Creates a named capture group for the proceeding elements. Needs to be finalised with .end(). Can be later referenced with namedBackreference(name) or backreference(index).
Example
SuperExpressive()
.namedCapture('interestingStuff')
.range('a', 'f')
.range('0', '9')
.string('XXX')
.end()
.toRegex();
// ->
/(?<interestingStuff>[a-f][0-9]XXX)/
Matches exactly what was previously matched by a namedCapture.
Example
SuperExpressive()
.namedCapture('interestingStuff')
.range('a', 'f')
.range('0', '9')
.string('XXX')
.end()
.string('something else')
.namedBackreference('interestingStuff')
.toRegex();
// ->
/(?<interestingStuff>[a-f][0-9]XXX)something else\k<interestingStuff>/
Matches exactly what was previously matched by a capture or namedCapture using a posi
暂无开放 Issues,或尚未同步最近议题。