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

时间:2018-07-15 07:47:26

标签: c# parsing system.memory

据说ReadOnlySpan<char>非常适合解析,因此我尝试使用它,并且遇到了一个我不知道如何处理的用例。


我有一个命令行string,其中参数前缀-和分隔符(空格)被转义了(我知道我可以在这里引用它们,但是对于出于这个问题,让我们假设它不是一个选项)

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

令牌生成器应返回以下令牌:

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

案例12很简单,因为在这里我只能使用str.Slice(i, length),但是如何创建3rd案例并只返回一个ReadOnlySpan<char>Slice方法不允许我指定多个start/length范围,而这些范围对于跳过转义字符\是必需的。

示例:

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

其中(10,4) = "-bar"(15,3) = " qux"

有了StringBuilder,您就可以跳过几个字符,稍后再Append个字符。我如何用ReadOnlySpan<char>达到相同的结果?

2 个答案:

答案 0 :(得分:1)

Span/ReadOnlySpan是连续的内存块。它不能包含多个范围。此设计对于性能而言是必需的。 Span/ReadOnlySpan应该和数组一样快。数组之所以快,是因为它们是连续的内存块,没有进一步的抽象。

在没有分配新字符串的情况下,我看不到做到这一点的方法。您可以对所有连续的子字符串使用Span/ReadOnlySpan,但是您的解析问题似乎不适合使用span存储结果。

答案 1 :(得分:1)

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

,更准确地说是: TokenSequence.cs

用法:

TypeError: request is not a function

通过以下方式消费:

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

可以通过以下方法完成转义: ParsedSequence.cs

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

希望这会有所帮助