Superpower:一个基于 C# 的文本解析工具开源项目
推荐一个文本解析开源工具: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 -
推荐阅读
Atata:一个基于 Selenium的C#自动化测试Web框架
mongo-csharp-driver:MongoDB官方的C#客户端驱动程序!
Superpower:一个基于 C# 的文本解析工具开源项目的更多相关文章
- ImageSharp一个专注于NetCore平台图像处理的开源项目
今天大家分享的是一个专注于NetCore平台图像处理的开源项目,老实说为这篇文章取名字想了5分钟,可能是词穷亦或是想更好的表达出这款开源项目的作用:这个项目在图像处理方面有很多功能,如:缩放,裁剪,绘 ...
- 大数据之路week07--day05 (一个基于Hadoop的数据仓库建模工具之一 HIve)
什么是Hive? 我来一个短而精悍的总结(面试常问) 1:hive是基于hadoop的数据仓库建模工具之一(后面还有TEZ,Spark). 2:hive可以使用类sql方言,对存储在hdfs上的数据进 ...
- 几种基于Java的SQL解析工具的比较与调用
1.sqlparser http://www.sqlparser.com/ 优点:支持的数据库最多,除了传统数据库外还支持hive和greenplum一类比较新的数据库,调用比较方便,功能不错 缺点: ...
- Vue3教程:一个基于 Vue 3 + Vant 3 的商城项目开源啦!
之前发布过一篇文章,告诉大家我要开发一个 Vue3 的商城项目并开源到 GitHub 上,供大家练手和学习,随后也一直有收到留言和反馈,问我开发到哪里了,什么时候开源之类的问题,今天终于可以通知大家, ...
- 一个基于Java线程池管理的开源框架Hippo4j实践
@ 目录 概述 定义 线程池痛点 功能 框架概览 架构 部署 Docker安装 二进制安装 运行模式 依赖配置中心 接入流程 个性化配置 线程池监控 无中间件依赖 接入流程 服务端配置 三方框架线程池 ...
- 我发起了一个用 .Net 编写的 源代码管理工具 开源项目 SourceKit
发起这个 项目 的 起因 是 GitHub . Github 的 使用技能 俨然已经成了 一项新技术 , 这不是 工具 的 本意 . 我用过的 源代码 管理工具 不多, SVN 我觉得不错 . 常用 ...
- 分享一个基于Abp Vnext开发的API网关项目
这个项目起源于去年公司相要尝试用微服务构建项目,在网关的技术选型中,我们原本确认了ApiSix 网关,如果需要写网关插件需要基于Lua脚本去写,我和另外一个同事当时基于这个写了一个简单的插件,但是开发 ...
- 我发起了一个 .Net 平台上的 直播平台 开源项目 BalaBala
直播平台, 需要解决的 技术点 是 2 个: 1 直播数据 的 传输 和 在 客户端 的 播放 2 大并发 关于 网络通信, 数据传输, 可以参考 <利用 MessageRPC 和 Shar ...
- 文本建模、文本分类相关开源项目推荐(Pytorch实现)
Awesome-Repositories-for-Text-Modeling repo paper miracleyoo/DPCNN-TextCNN-Pytorch-Inception Deep Py ...
- 基于Java的简易表达式解析工具(一)
最近需要用到相关表达式解析的工具,然后去网上搜索,找到了一个用C#写的表达式解析工具,仔细看了功能后发现,这正是我需要的,如果我能将它改造成基于Java语言的方式,岂不是更好吗,所以花了一段时间,把网 ...
随机推荐
- [快速阅读八] HDR->LDR:Matlab中tonemapfarbman函数的解析和自我实现。
最近受朋友的委托,想自己实现Matlab里的一个HDR转LDR的函数,函数名是tonemapfarbman,乘着十一假期,稍微浏览下这个函数,并做了一点C++的实现和优化. 为了看到这个函数的效果,需 ...
- 使用VNC连接ubuntu16.4错误Authentication Failure问题
解决办法:是因为vnc用一套自己的密码系统,不要去输入ssh登录时的密码,所以只需要进入远程服务器中,设置一哈vnc的密码即可! 在终端输入命令:vncpasswd 到此可以试试远程
- Notepad--特色功能:拷贝另存为
Notepad--特色功能:拷贝另存为 你是否纠结如下的使用场景: 正在编辑的文件,还没有想好,保存担心把原文件给覆盖了. 使用"另存为"后当前编辑界面的文档又变成新的文件了,可是 ...
- ArgoWorkflow教程(七)---高效的步骤间文件共享策略
之前我们分析了使用 artifact 实现步骤间文件共享,今天分享一下如何使用 PVC 实现高效的步骤间文件共享. 1. 概述 之前在 artifact 篇我们演示了如何使用 artifact 实现步 ...
- Python3开启简易服务器
nohup python3 -m http.server 3000 2>&1 &
- 局部加权回归(Lowess)
代码示例:(源自:https://blog.csdn.net/weixin_71158509/article/details/136060826) import numpy as np import ...
- 2.9 使用系统光盘修复Linux系统
如果系统错误已经导致单用户模式不能进入了,那么是否需要重新安装Linux 系统?不用着急,为了应对单用户模式也无法修复的错误,Linux 系统提供了 rescue 救援(光盘修复)模式. rescue ...
- Chapter12 动态内存与智能指针
目录 12.1.0 介绍 12.1.1 shared_ptr类 make_shared函数 shared_ptr的拷贝和引用 shared_ptr自动销毁所管理的对象- -shared_ptr还会自动 ...
- Abp源码分析之Abp本地化
aspnetcore mvc 实现本地化 新建mvc项目 修改Program.cs using Microsoft.AspNetCore.Localization; using Microsoft.A ...
- Python预安装包制作
预编译安装包 在Linux服务器上,经常会安装Python.Redis.Nginx等服务,不管离线.在线都需要编译.编译之前还需要安装一些依赖的环境,比如,openssl.gcc.g++等,但是mak ...