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

标签 c# parsing system.memory

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


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

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

标记生成器应返回以下标记:

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

案例1 & 2很简单,因为在这里我可以使用 str.Slice(i, length)但我怎样才能创建 3rd case 并仅返回单个 ReadOnlySpan<char>Slice方法不允许我指定多个 start/length为了跳过转义字符 \ 所需的范围.

示例:

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

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

StringBuilder您可以跳过几个字符并 Append其他的稍后再说。我如何通过 ReadOnlySpan<char> 获得相同的结果?

最佳答案

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

我没有找到在不分配新字符串的情况下执行此操作的方法。您可以将 Span/ReadOnlySpan 用于所有连续的子字符串,但似乎您的解析问题不适合使用 span 来存储结果。

关于c# - 使用 ReadOnlySpan<char> 处理转义序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51346366/

相关文章:

c# - 为什么我的交易没有升级为 DTC?

c++ - 解析 mmap()-ed 文件

php - 如何从原始 HTML 文件中提取数据?

c# - 获取 Memory<byte>/Span<byte> 可变结构的正确方法?

c# - 如何在Microsoft实体模型框架中执行Sql原始查询

c# - 如何缓冲 BCP 输出而不是写入文件

c# - .Net Core 1.1 中的传递引用

regex - key :value pairs 的 Scala 正则表达式解析器

c# - Span<T> 不需要局部变量赋值。那是一个功能吗?