melody是一款rust编写的编译输出为正则表达式的语言。Arch用户可以使用 paru -Syu melody 来安装,vscode和jetbrains系的IDE也有插件。
语法
下面是基于官方book的机翻语法。
量词
... of- 用于表达特定数量的模式。相当于正则表达式{5}(假设5 of ...)... to ... of- 用于表示模式范围内的数量。相当于正则表达式{5,9}(假设5 to 9 of ...)over ... of- 用于表达多个模式。相当于正则表达式{6,}(假设over 5 of ...)some of- 用于表达 1 个或多个模式。相当于正则表达式+any of- 用于表达 0 个或多个模式。相当于正则表达式*option of- 用于表示模式的 0 或 1。相当于正则表达式?
所有量词前面都可以添加 lazy 以匹配最少数量的字符而不是最多的字符(贪婪)。相当于正则表达式 +? 、 *? 等。
符号
<char>- 匹配任何单个字符。相当于正则表达式.<space>- 匹配空格字符。相当于正则表达式``<whitespace>- 匹配任何类型的空白字符。相当于正则表达式\s或[ \t\n\v\f\r]<newline>- 匹配换行符。相当于正则表达式\n<tab>- 匹配制表符。相当于正则表达式\t<return>- 匹配回车符。相当于正则表达式\r<feed>- 匹配换页符。相当于正则表达式\f<null>- 匹配空字符。相当于正则表达式\0<digit>- 匹配任何单个数字。相当于正则表达式\d或[0-9]<vertical>- 匹配垂直制表符。相当于正则表达式\v<word>- 匹配单词字符(任何拉丁字母、任何数字或下划线)。相当于正则表达式\w或[a-zA-Z0-9_]<alphabetic>- 匹配任何单个拉丁字母。相当于正则表达式[a-zA-Z]<alphanumeric>- 匹配任何单个拉丁字母或任何单个数字。相当于正则表达式[a-zA-Z0-9]<boundary>- 匹配<word>匹配的字符和<word>不匹配的字符之间的字符,而不消耗该字符。相当于正则表达式\b<backspace>- 匹配退格控制字符。相当于正则表达式[\b]
所有符号都可以在 not 前面,以匹配除该符号之外的任何字符
特殊符号
<start>- 匹配字符串的开头。相当于正则表达式^<end>- 匹配字符串的结尾。相当于正则表达式$
unicode
注意:在 CLI( -t 或 -f )中测试时不支持这些,因为使用的正则表达式引擎不支持 unicode 类别。这些需要使用 u 标志。
<category::letter>- 来自任何语言的任何类型的字母<category::lowercase_letter>- 具有大写变体的小写字母<category::uppercase_letter>- 具有小写变体的大写字母。<category::titlecase_letter>- 仅当单词的第一个字母大写时出现在单词开头的字母<category::cased_letter>- 存在小写和大写变体的字母<category::modifier_letter>- 像字母一样使用的特殊字符<category::other_letter>- 没有小写和大写变体的字母或表意文字
<category::mark>- 用于与另一个字符组合的字符(例如重音符号、变音符号、封闭框等)<category::non_spacing_mark>- 旨在与另一个字符组合而不占用额外空间的字符(例如重音符号、变音符号等)<category::spacing_combining_mark>- 用于与另一个占用额外空间的字符组合的字符(许多东方语言中的元音符号)<category::enclosing_mark>- 包含与其组合的字符的字符(圆形、方形、键帽等)
<category::separator>- 任何类型的空白或不可见分隔符<category::space_separator>- 不可见但占用空间的空白字符<category::line_separator>- 行分隔符 U+2028<category::paragraph_separator>- 段落分隔符 U+2029
<category::symbol>- 数学符号、货币符号、装饰符号、方框图字符等<category::math_symbol>- 任何数学符号<category::currency_symbol>- 任何货币符号<category::modifier_symbol>- 组合字符(标记)作为其自身的完整字符<category::other_symbol>- 各种非数学符号、货币符号或组合字符的符号
<category::number>- 任何脚本中的任何类型的数字字符<category::decimal_digit_number>- 除表意文字之外的任何文字中的数字 0 到 9<category::letter_number>- 看起来像字母的数字,例如罗马数字<category::other_number>- 上标或下标数字,或非数字 0–9 的数字(不包括表意文字的数字)
<category::punctuation>- 任何类型的标点符号<category::dash_punctuation>- 任何类型的连字符或破折号<category::open_punctuation>- 任何类型的左括号<category::close_punctuation>- 任何类型的右括号<category::initial_punctuation>- 任何类型的开盘报价<category::final_punctuation>- 任何类型的收盘价<category::connector_punctuation>- 标点符号,例如连接单词的下划线<category::other_punctuation>- 除破折号、括号、引号或连接符之外的任何类型的标点字符
<category::other>- 不可见的控制字符和未使用的代码点<category::control>- ASCII 或 Latin-1 控制字符:0x00–0x1F 和 0x7F–0x9F<category::format>- 不可见的格式指示器<category::private_use>- 保留供私人使用的任何代码点<category::surrogate>- UTF-16 编码中代理对的一半<category::unassigned>- 未分配字符的任何代码点
这些描述来自regular-expressions.info
字符范围
... to ...- 与数字或字母字符一起使用来表示字符范围。相当于正则表达式[5-9](假设5 to 9)或[a-z](假设a to z)
文字
"..."或'...'- 用于标记匹配的文字部分。 Melody 会根据需要自动转义字符。引号(与文字周围的同类)应该被转义
Raw
...- 直接添加到输出中,无需任何转义
分组
capture- 用于打开capture或命名的capture块。捕获的模式稍后可在匹配列表中使用(位置匹配或命名匹配)。相当于正则表达式(...)match- 用于打开match块,匹配内容而不捕获。相当于正则表达式(?:...)either- 用于打开either块,匹配块内的语句之一。相当于正则表达式(?:...|...)
断言
ahead- 用于打开ahead块。相当于正则表达式(?=...)。在表达式之后使用behind- 用于打开behind块。相当于正则表达式(?<=...)。在表达式之前使用
断言前面可以添加 not 以创建否定断言(相当于正则表达式 (?!...) 、 (?<!...) )
变量
-
let .variable_name = { ... }- 定义语句块中的变量。稍后可以与.variable_name一起使用。变量必须在使用前声明。变量调用不能直接量化,如果要量化变量调用,请使用组例子:
let .a_and_b = { "a"; "b"; } .a_and_b; "c"; // abc
附加功能
/* ... */、// ...- 用于标记注释(注意:// ...注释必须单独一行)
使用
Todo