推荐一个文本解析开源工具:Superpower,方便我们解析文本,比如解析日志文件、构建自己的编程语言还是其他需要精确解析和错误报告的场景。

01 项目简介

Superpower 的核心功能是将字符序列作为输入,并生成一个数据结构,以便程序更容易分析、操作或转换。这可以是简单的数字、数据格式中的字段列表,或者是某种编程语言的抽象语法树。

Superpower 允许以声明式风格编写解析器,并在遇到无效输入时提供精确和信息丰富的错误报告。

Superpower 在构建时特别注重性能。通过减少回溯、避免分配和间接调度,从而用于极高的性能。

02 使用方法

1、安装依赖

dotnet add package Superpower

2、解析连续大写 'A' 字符的简单文本解析器

var parseA = Character.EqualTo('A').AtLeastOnce();

3、构建复杂的解析器

//解析器:由一个字母开头,后面可以跟任意数量的字母、数字或下划线
TextParser<string> identifier =
// 使用LINQ查询表达式来构建解析器
from first in Character.Letter // 第一个字符必须是字母。
// 后续字符可以是字母、数字或下划线,且可以出现多次(Many()表示0次或多次)。
from rest in Character.LetterOrDigit.Or(Character.EqualTo('_')).Many()
    // 将第一个字符和后续字符组合成一个字符串。
select first + new string(rest); // 使用上面定义的identifier解析器来解析字符串"abc123"。
var id = identifier.Parse("abc123"); //验证解析结果是否与预期值"abc123"相等
Assert.Equal("abc123", id);

4、除了逐个字符使用输入字符的文本解析器外,Superpower还支持令牌解析器。

// 一个简单的算术表达式:"1 * (2 + 3)"。
var expression = "1 * (2 + 3)"; // 1. 使用一个算术表达式分词器(ArithmeticExpressionTokenizer)来分词。 var tokenizer = new ArithmeticExpressionTokenizer();
var tokenList = tokenizer.Tokenize(expression); // 分词后,tokenList将包含表达式中的各个token。 // 2. 使用一个算术表达式解析器(ArithmeticExpressionParser)来解析分词后的token列表。
var parser = ArithmeticExpressionParser.Lambda; // parser built with combinators
var expressionTree = parser.Parse(tokenList); // 解析后,expressionTree将是一个表示表达式的AST。 // 使用解析结果(即AST)
// Compile方法可能是一个将AST转换为一个可执行函数(或委托)的方法。
// 这个函数接受没有参数并返回表达式的结果。
var eval = expressionTree.Compile();

5、遇到无效输入时提供精确和信息丰富的错误报告

ArithmeticExpressionParser.Lambda.Parse(
// 对字符串"1 + * 3"进行分词,得到一个token序列。
// 这个序列应该包含数字1的token、加号(+)的token、星号(*)的token和数字3的token。
new ArithmeticExpressionTokenizer().Tokenize("1 + * 3")
); // 解析器在解析过程中遇到了一个语法错误,并报告了错误信息。
// -> Syntax error (line 1, column 5): unexpected operator `*`, expected expression.

03 项目示例与应用

Superpower 提供了多个示例,包括 JSON 解析器、ISO-8601 日期时间解析器等。

具体见:https://github.com/datalust/superpower/tree/dev/sample

另外****Superpower被用于多个实际项目中,例如:

Serilog.Expressions,日志事件解析扩展:

https://github.com/serilog/serilog-expressions

seqcli,纯文本日志解析:

https://github.com/datalust/seqcli

PromQL.Parser,Prometheus查询语言的解析器:

https://github.com/djluck/PromQL.Parser

04 项目地址

https://github.com/datalust/superpower

更多开源项目: https://github.com/bianchenglequ/NetCodeTop

- End -

推荐阅读

2个零基础入门框架教程!

推荐一个Star超过2K的.Net轻量级的CMS开源项目

Pidgin:一个轻量级、快速且灵活的 C# 解析库

Atata:一个基于 Selenium的C#自动化测试Web框架

mongo-csharp-driver:MongoDB官方的C#客户端驱动程序!

Superpower:一个基于 C# 的文本解析工具开源项目的更多相关文章

  1. ImageSharp一个专注于NetCore平台图像处理的开源项目

    今天大家分享的是一个专注于NetCore平台图像处理的开源项目,老实说为这篇文章取名字想了5分钟,可能是词穷亦或是想更好的表达出这款开源项目的作用:这个项目在图像处理方面有很多功能,如:缩放,裁剪,绘 ...

  2. 大数据之路week07--day05 (一个基于Hadoop的数据仓库建模工具之一 HIve)

    什么是Hive? 我来一个短而精悍的总结(面试常问) 1:hive是基于hadoop的数据仓库建模工具之一(后面还有TEZ,Spark). 2:hive可以使用类sql方言,对存储在hdfs上的数据进 ...

  3. 几种基于Java的SQL解析工具的比较与调用

    1.sqlparser http://www.sqlparser.com/ 优点:支持的数据库最多,除了传统数据库外还支持hive和greenplum一类比较新的数据库,调用比较方便,功能不错 缺点: ...

  4. Vue3教程:一个基于 Vue 3 + Vant 3 的商城项目开源啦!

    之前发布过一篇文章,告诉大家我要开发一个 Vue3 的商城项目并开源到 GitHub 上,供大家练手和学习,随后也一直有收到留言和反馈,问我开发到哪里了,什么时候开源之类的问题,今天终于可以通知大家, ...

  5. 一个基于Java线程池管理的开源框架Hippo4j实践

    @ 目录 概述 定义 线程池痛点 功能 框架概览 架构 部署 Docker安装 二进制安装 运行模式 依赖配置中心 接入流程 个性化配置 线程池监控 无中间件依赖 接入流程 服务端配置 三方框架线程池 ...

  6. 我发起了一个用 .Net 编写的 源代码管理工具 开源项目 SourceKit

    发起这个 项目 的 起因 是 GitHub . Github 的 使用技能 俨然已经成了 一项新技术 , 这不是 工具 的 本意 . 我用过的 源代码 管理工具 不多,  SVN 我觉得不错 . 常用 ...

  7. 分享一个基于Abp Vnext开发的API网关项目

    这个项目起源于去年公司相要尝试用微服务构建项目,在网关的技术选型中,我们原本确认了ApiSix 网关,如果需要写网关插件需要基于Lua脚本去写,我和另外一个同事当时基于这个写了一个简单的插件,但是开发 ...

  8. 我发起了一个 .Net 平台上的 直播平台 开源项目 BalaBala

    直播平台, 需要解决的 技术点 是 2 个: 1  直播数据 的 传输 和 在 客户端 的 播放 2  大并发 关于 网络通信, 数据传输, 可以参考 <利用 MessageRPC 和 Shar ...

  9. 文本建模、文本分类相关开源项目推荐(Pytorch实现)

    Awesome-Repositories-for-Text-Modeling repo paper miracleyoo/DPCNN-TextCNN-Pytorch-Inception Deep Py ...

  10. 基于Java的简易表达式解析工具(一)

    最近需要用到相关表达式解析的工具,然后去网上搜索,找到了一个用C#写的表达式解析工具,仔细看了功能后发现,这正是我需要的,如果我能将它改造成基于Java语言的方式,岂不是更好吗,所以花了一段时间,把网 ...

随机推荐

  1. 内核级流量治理引擎Kmesh八大新特性解读

    本文分享自华为云社区<内核级流量治理引擎 Kmesh v0.5 发布!进击的Sidecarless服务网格>,作者:云容器大未来. 我们非常高兴地宣布 Kmesh v0.5.0 的发布.首 ...

  2. spring cloud openfeign源码分析

    大体流程鱼骨图 1.读取配置 启动类上添加注解@EnableFeignClients,工程启动后会自动读取注解上的配置 1 @Retention(RetentionPolicy.RUNTIME) 2 ...

  3. KubeSphere 社区双周报 | KubeSphere 3.4.1 发布 | 2023.10.27-11.09

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  4. OpenFunction v0.8.0 发布:通过 Dapr Proxy 加速函数启动

    相较于其他函数计算项目,OpenFunction 有很多独特的功能,其中之一便是通过 Dapr 与各种后端服务(BaaS)无缝集成.目前 OpenFunction 已经支持了 Dapr 的 pub/s ...

  5. 自学PHP笔记(二)PHP数据类型

    PHP数据类型可支持以下8种类型: 类型 说明 string 字符串 boolean 布尔值 integer 整型 float 浮点型 array 数组 object 对象 resource 资源 N ...

  6. 【速记】C++ STL自定义排序

    因为是"速记",难免会有不完善的地方.这篇笔记咱日后应该还会进行补充. 关于sort的比较函数 void sort( RandomIt first, RandomIt last, ...

  7. SpringBoot学习 _02 _配置单数据源(1)

    SpringBoot学习 _02 _配置单数据源(1) 1.通过IDEA创建SpringBoot项目 直接到选择依赖这一步,选择如图所示的 五个依赖即可 2.配置文件的编写 此处说明一下,这个数据库连 ...

  8. Next.js 从零入门到实战 3:2024最新完整教程 | 包含SSR、API路由和性能优化

    CSS样式学习 上一篇文章讲到如何创建一个脚手架程序,目前我们已经有了一个nextjs的基本框架,因此我们可以在这个基础上进行改造.打开我们项目中的page.tsx页面,这里是程序的主页面,也就是我们 ...

  9. hadoop运行原理

    包括HDFS和Mapreduce两部分. 1)HDFS自动保存多个副本,移动计算.缺点是小文件存取占用namenode内存,写入只支持追加,不能随机修改. 它存储的逻辑空间称为block,文件的权限类 ...

  10. spring生态体系

    spring boot使用默认开发配置来实现快速开发spring xd用来简化大数据应用开发spring cloud为分布式系统开发提供工具集spring data对主流的关系型和nosql数据库的支 ...