据说ReadOnlySpan<char>
非常适合解析,因此我尝试使用它,并且遇到了一个我不知道如何处理的用例。
我有一个命令行string
,其中参数前缀-
和分隔符(空格)被转义了(我知道我可以在这里引用它们,但是对于出于这个问题,让我们假设它不是一个选项):
var str = @"foo -bar \-baz\ qux".AsMemory();
令牌生成器应返回以下令牌:
foo
-命令名称bar
-参数名称-baz qux
-参数值案例1
和2
很简单,因为在这里我只能使用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>
达到相同的结果?
答案 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());
希望这会有所帮助