超级表达性:用(几乎)自然语言构建正则表达式的库

2020-07-20 19:49:42

Super Expression是一个JavaScript库,它允许您用几乎自然的语言构建正则表达式-没有额外的依赖,并且代码占用少(缩写+gzip!小于3KB)。

正则表达式是一个非常强大的工具,但其简洁而隐晦的词汇表可能会使构建和与他人通信成为一项挑战。即使是很好地理解它们的开发人员也可能在几个月后读不懂他们自己的回帖!此外,它们不能轻易地以编程的方式创建和操作-关闭了动态文本处理的整个途径。

这就是超级表现力的用武之地。它提供了一种编程的和人类可读的方式来创建正则表达式。它的API使用流畅的构建器模式,并且是完全不变的。它旨在实现可发现和可预测:

秩序很重要!量词在它们改变之前指定,就像在英语中一样(例如SuperExpression().EXACTLY(5).digit)。

如果你犯了错误,你会知道如何改正的。如果您的表达式无效,SuperExpression会引导您进行修复。

SuperExpression将那些出现在代码审查中的复杂而不怪异的正则表达式转变为您的同行可以阅读、理解和正确审阅的东西-并且任何人都可以维护!

以下示例识别并捕获16位十六进制数(如0xC0D3)的值。

Const SuperExpression=Required(';Super-Expression&39;);const myRegex=SuperExpression()。StartOfInput。可选。字符串(';0x';)。抓捕。完全正确(4)。任何一个。范围(';A';,';F';)。范围(';a';,';f';)。范围(';0';,';9';)。End()。End()。EndOfInput。ToRegex();//生成以下正则表达式:/^(?:0x)?([a-Fa-f0-9]{4})$/

在正则表达式上使用g标志,这指示在对字符串运行时,它应该匹配多个值。

在正则表达式上使用m标志,这指示它应将.startOfInput和.endOfInput标记视为行的开始和结束。

在正则表达式上使用I标志,这指示在匹配时应忽略大写/小写区别。

在正则表达式上使用y标志,这指示它应该创建可以从上次匹配恢复的有状态正则表达式。

在正则表达式上使用u标志,这指示它应该使用完全Unicode匹配。

在正则表达式上使用s标志,这指示应将输入视为单行,其中.startOfInput和.endOfInput标记显式标记输入的开始和结束,并且.anyChar还匹配换行符。

在与.word匹配的字符和不与.word匹配的字符之间立即匹配(不消耗任何字符)(按任一顺序)。

为后续元素创建捕获组。需要使用.end()完成。以后可以用反向引用(索引)引用。

为后续元素创建命名捕获组。需要使用.end()完成。以后可以用namedBackreference(Name)或backreference(Index)引用。

使用位置索引精确匹配以前由捕获或命名捕获匹配的内容。注意,正则表达式索引从1开始,因此第一个捕获组的索引为1。

断言在没有使用它们的情况下找到了进行中的元素。需要使用.end()完成。

断言如果不使用这些元素,就不会找到它们。需要使用.end()完成。

断言前面的元素可能不匹配,或者可能多次匹配。

断言前面的元素可能不匹配,或者可能匹配多次,但尽可能少。

断言前面的元素可能匹配一次,也可能匹配多次。

断言前面的元素可以匹配一次,也可以匹配多次,但尽可能少。

断言Processing元素将匹配x到y次之间的某个位置,但次数尽可能少。

断言输入的开始,或在使用.lineByLine时断言行的开始。

断言输入末尾,或在使用.lineByLine时断言行末。

匹配与str长度相同的任何字符串,但str中顺序定义的字符除外。

匹配任何字符,但a和b指定的.range将捕获的字符除外。

匹配介于a和b之间的任何字符。排序由字符ASCII或Unicode值定义。

SuperExpression()。AllowMultipleMatches。按行排列。StartOfInput。可选。字符串(';0x';)。抓捕。完全正确(4)。任何一个。范围(';A';,';F';)。范围(';a';,';f';)。范围(';0';,';9';)。End()。End()。EndOfInput。ToRegexString();//->;";/^(?:0x)?([a-Fa-f0-9]{4})$/gm";

SuperExpression()。AllowMultipleMatches。按行排列。StartOfInput。可选。字符串(';0x';)。抓捕。完全正确(4)。任何一个。范围(';A';,';F';)。范围(';a';,';f';)。范围(';0';,';9';)。End()。End()。EndOfInput。ToRegex();//->;/^(?:0x)?([a-Fa-f0-9]{4})$/gm