代码之家  ›  专栏  ›  技术社区  ›  t3chb0t

使用readonlyspan<char>处理转义序列

  •  2
  • t3chb0t  · 技术社区  · 7 年前

    这个 ReadOnlySpan<char> 据说它非常适合解析,所以我试着使用它,却遇到了一个不知道如何处理的用例。


    我有命令行 string 其中参数前缀 - 以及分离器 (空格)被转义 (我知道我可以在这里引用它们,但为了解决这个问题,我们假设它不是一个选项) 以下内容:

     var str = @"foo -bar \-baz\ qux".AsMemory();
    

    令牌赋予器应返回以下令牌:

    1. foo -命令名
    2. bar -参数名
    3. -baz qux -参数值

    案例 1 &安培 2 很简单因为在这里我可以用 str.Slice(i, length) 但我如何才能创造 3rd 只返回一个 就绪平移<char> 是吗?这个 Slice 方法不允许我指定多个 start/length 需要的范围,以便 跳过去 转义字符 \ .

    例子:

    str.Slice((10, 4), (15, 3)); 
    

    在哪里? (10,4) = "-bar" (15,3) = " qux"

    StringBuilder 你可以跳过几个字符 Append 其他的稍后。我怎样才能得到同样的结果 就绪平移<char> 是吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   usr    7 年前

    一个 Span/ReadOnlySpan 是一个连续的内存块。它不能包含多个范围。这种设计对性能是必要的。 跨度/就绪跨度 应该和数组的速度一样快。数组很快,因为它们是连续的内存块,没有进一步的抽象。

    如果不分配一个新字符串,我就看不到这样做的方法。你可以用 跨度/就绪跨度 对于所有相邻的子字符串,但似乎您的解析问题不适合使用SPAN来存储结果。

        2
  •  1
  •   Michał Bryłka    6 年前

    看看: https://github.com/nemesissoft/Nemesis.TextParsers

    更准确地说是: TokenSequence.cs

    用法:

    var tokens = "ABC|CD\|E".AsSpan().Tokenize('|', '\\', false); //no allocation. Result in 2 elements: "ABC", "CD\|E". 
    

    消费途径:

    var result = new List<string>();
    foreach (var part in tokens)
         result.Add(part.ToString());
    

    可通过以下方式完成无逃逸: ParsedSequence.cs

    SpanParserHelper.UnescapeCharacter()
    

    希望这有帮助

    推荐文章