超表达–用自然语言编写正则表达式

2021-01-21 23:53:51

Super Expressive是一个JavaScript库,可让您以几乎自然的语言构建正则表达式-无需额外的依赖关系,并且代码占用量小(压缩+ gzip不到3kb!)。

正则表达式是一个非常强大的工具,但其简洁而神秘的词汇可能使与他人进行构建和交流成为一个挑战。即使是对它们很了解的开发人员,也可能在几个月后难以阅读自己的文章!此外,不能以编程方式轻松创建和操作它们-从而关闭了动态文本处理的整个途径。

那就是Super Expressive出现的地方。它提供了程序化和人类可读的方式来创建正则表达式。它的API使用流畅的构建器模式,并且是完全不变的。它被构建为可发现和可预测的:

订单很重要!量词在变化之前指定,就像英语一样(例如SuperExpressive()。exactly(5).digit)

如果您输入有误,就会知道如何解决。如果您的表情无效,SuperExpressive将指导您进行修复

SuperExpressive将出现在代码审查中的那些复杂而笨拙的正则表达式转换成可以被您的同龄人(任何人都可以读取,理解和正确地对其进行审查)的东西!

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

const SuperExpressive = require(' super-expressive'); const myRegex = SuperExpressive()。 startOfInput。可选的 。字符串(' 0x')。抓获。恰好(4)。任何 。范围(' A',' F')。范围(' a',' f')。范围(' 0',' 9')。结束 ( ) 。结束 ( ) 。 endOfInput。 toRegex(); //产生以下正则表达式:/ ^(?:0x)? ([A-Fa-f0-9] {4})$ /

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

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

在正则表达式上使用i标志,表示匹配时应忽略大小写区分。

在正则表达式上使用y标志,表明它应创建一个有状态的正则表达式,该表达式可从上一次匹配中恢复。

在正则表达式上使用u标志,表示应使用完整的unicode匹配。

在正则表达式上使用s标志,该标志指示输入应视为单行,.startOfInput和.endOfInput标记在其中明确标记输入的开始和结束,.anyChar也与换行符匹配。

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

为后续元素创建一个捕获组。需要使用.end()完成。以后可以用backreference(index)引用。

为后续元素创建一个命名捕获组。需要使用.end()完成。以后可以用namedBackreference(name)或backreference(index)进行引用。

使用位置索引完全匹配捕获或namedCapture先前匹配的内容。注意regex索引从1开始,因此第一个捕获组的索引为1。

断言找到了进行中的元素而不消耗它们。需要使用.end()完成。

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

断言进行中的元素可能不匹配,或者可能多次匹配。

断言进行中的元素可能不匹配,或者可以匹配多次,但应尽可能少地匹配。 断言前进元素可以匹配一次,也可以匹配多次。 断言进行中的元素可以匹配一次,也可以匹配多次,但次数尽可能少。 断言进行中的元素将在x和y次之间的某个位置进行匹配,但应尽可能少地匹配一次。 断言输入的开始,或使用.lineByLine时的行的开始。 声明输入的末尾,或使用.lineByLine时的行尾。 匹配任何与str长度相同的字符串,但在str中顺序定义的字符除外。

匹配任何字符,除了那些由a和b指定的.range捕获的字符。 匹配介于a和b之间的任何字符。 排序由字符ASCII或Unicode值定义。 超表达()。 allowMultipleMatches。 逐行 。 startOfInput。 可选的 。 字符串(' 0x')。 抓获。 恰好(4)。 任何 。 范围(' A',' F')。 范围(' a',' f')。 范围(' 0',' 9')。 结束 ( ) 。 结束 ( ) 。 endOfInput。 toRegexString(); //-> " / ^(?: 0x)?([A-Fa-f0-9] {4})$ / gm" 超表达()。 allowMultipleMatches。 逐行 。 startOfInput。 可选的 。 字符串(' 0x')。 抓获。 恰好(4)。 任何 。 范围(' A',' F')。 范围(' a',' f')。 范围(' 0',' 9')。 结束 ( ) 。 结束 ( ) 。 endOfInput。 toRegex(); //-> / ^(?:0x)? ([A-Fa-f0-9] {4})$ /克