8个稳定版本

1.2.0 2023年9月17日
1.1.3 2023年6月25日
1.0.2 2023年6月25日
1.0.1 2023年6月24日

解析器实现 中排名第2200

Download history 41/week @ 2024-03-29 12/week @ 2024-04-05 1/week @ 2024-04-12 1/week @ 2024-06-07 2/week @ 2024-06-14 2/week @ 2024-06-21 10/week @ 2024-06-28 87/week @ 2024-07-05

每月下载量99
用于 nu-plugin-bexpand

MPL-2.0 许可证

35KB
795 代码行

bexpand

Rust中的Bash风格括号展开。

功能

  • 普通字符串就是普通字符串:abcd
  • 特殊字符需要用前面的\转义才能被视为普通字符:ab\{cd
    • 在列表外部,特殊字符是{}\
    • 在列表内部,特殊字符是,{}\
    • 在序列内部,特殊字符是,.{}\
  • 任何前面带有\的字符都将被当作字面量处理,即使它是多余的。
    • 例如,\n代表n,而不是换行符。
  • 列表是括号包围的逗号分隔的表达式列表:{a,b,c}{a,,c}{}{,}
    • 空列表仍然是列表。
    • 列表可以有空的或重复的字段。
    • 列表产生其包含表达式的所有值。
  • 序列可以是数值序列或字符序列。
  • 数值序列的形式为{<spec><start>..<end>[..<stride>]}
    • <spec> 是一组可能的空格式说明符字符。
      • = 表示将每个项扩展到与 <start><end> 最长字符宽度相同的宽度。
    • <start><end> 是有符号的 64 位整数。如果 <end> 小于 <start>,则序列将向下计数。
    • <stride> 是一个可选的非负增量数,用于按大于 1 的增量计数。
      • 默认的 <stride>1
      • 一个零 <stride> 总是规范化为 1 以防止无限循环。
      • 步长可能导致跳过端点,甚至在不出现错误的情况下达到数字大小限制。
        • '{9223372036854775806..9223372036854775807..1000}' 只产生 9223372036854775806,而不是错误。
  • 字符序列的形式为 {<start>..<end>[..<stride>]}
    • <start><end> 是用于生成顺序的 Unicode 字符。如果 <end> 小于 <start>,则序列将循环向下。如果这个范围最终会生成一个代理代码点,则每个都会给出错误。
      • 错误不会终止迭代。如果返回错误,随后移出代理范围的迭代仍可能产生有效值。
        • 这可能在某个时刻用来允许可选的替换字符,但我认为当前直接抛出错误更有价值。
    • <stride> 是一个可选的非负增量数,用于按大于 1 的增量计数。
      • 默认的 <stride>1
      • 一个零 <stride> 总是规范化为 1 以防止无限循环。
      • 步长可能导致跳过端点,甚至在不出现错误的情况下达到数字大小限制。
        • '{a..z..1114111}'只会产生a,而不是错误
  • 表达式包含一系列普通字符串、列表和序列。
    • 表达式产生所有项的笛卡尔积:{a,b}c{d,e}f{g..i}产生["acdfg","acdfh","acdfi","acefg","acefh","acefi","bcdfg","bcdfh","bcdfi","bcefg","bcefh","bcefi"]
    • 表达式的顺序按字典顺序产生,以每个子表达式的索引为键。
  • 表达式和列表可以任意嵌套。
    • '{a,{b,,c{\,..\.}}{f..d..2}}' 产生 ["a","bf","bd","f","d","c,f","c,d","c-f","c-d","c.f","c.d"]

与 Bash 的差异

以下方式不符合 Bash 的风格

  • 存在一些被认为是不规范的模式,在 bexpand 中会抛出错误。如果发现错误模式,它不会尝试继续进行。
  • 花括号是特殊字符,如果没有正确形成或转义,则不允许使用。在 Bash 中 a{b,c}d}e 展开为 abd}e acd}e,而 a{b{c,d}e 展开为 a{bce a{bde。在 bexpand 中,这两个都是错误。
  • bexpand 将空列表和单元素列表视为可接受的。在 Bash 中,a{}ba{b}c 都会被 shell 简单地重复。在 bexpand 中,这些展开为 ababc
  • bexpand 允许字符序列迭代任何有效的 Unicode 代码点。{🥰..🥴..2} 是一个有效的字符序列,同样 {\{..\.}{9..A} 也是有效的。技术上,{0..9} 也是有效的,并且将被视为字符序列,尽管它展开成与相同形式的数字序列完全一样的东西。任何会生成非法 Unicode 代码点的东西都会生成错误。
  • 宽度指定符用开括号前的等号来表示,因此,在Bash中,{001..100}在bexpand中用{=1..100}来表示。这样可以允许像{=-5..10}这样的表达,这在Bash中是不可能的。

许可证

版权所有 2023 Taylor Richberger

根据Mozilla公共许可证第2.0版发布。

依赖项

~1.5MB
~29K SLoC