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语言的方式,岂不是更好吗,所以花了一段时间,把网 ...
随机推荐
- 关于 JS 函数的一切
本文基于: Bilibili - 自由的加百利 前置条件: 需掌握函数的编写.传参.返回.调用 理解作用域.掌握定时器的用法 知道引用类型和基本数据类型的区别 知道函数也是引用类型 听说过同步异步的概 ...
- ASP.NET Core OData 9的发布,放弃 .NET Framework
Microsoft 于 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9 包. 这个新包将ASP.NET Core与.NET 8 OData库保持一致,改变了OData ...
- iOSwkwebView 打开 TXT/PDF 文件乱码的问题
最近做资料文件下载下来并查看的时候,用 WKWebView 打开office 类型的文件的时候是没问题的,但是打开测试人员上传的一个 TXT/PDF 文件就出现了乱码问题,经过查看,应该是文件的编码问 ...
- 48 .var声明函数和function声明函数的区别
定义函数的方式: 1. 函数表达式定义函数 function expression 2. 函数式声明 function declaration 区别: var声明的函数,只能在声明之后调用,因为函数表 ...
- 【异常处理】Assistive Technology not found: com.sun.java.accessibility.AccessBridge
十一回来之后,工作电脑上的抓包工具Charles突然启动不起来了,双击图标后,一闪而过,就没动静了. 不知道是不是因为之前安装了什么工具.软件引起的. 打开CMD命令行,跳转到目录下启动,提示:Ass ...
- 这个Linux你敢用吗?
文中列出的命令绝对不可以运行,即使你觉得很好奇也不行,除非你是在虚拟机上运行(出现问题你可以还原),因为它们会实实在在的破坏你的系统.所以不在root等高级管理权限下执行命令是很好的习惯. 早晚有一天 ...
- Seralizable
class CSer { private String name; private int age; public CSer() { } public CSer(String name, int ag ...
- linux不常用命令
1.查看进程的内存资源占用 [root@abdi1 elasticsearch]# pidstat -r -p 1791 1 Linux 3.10.0-514.el7.x86_64 (abdi1) 0 ...
- SaaS多租户的3种隔离模式
大家好,我是汤师爷~ 在SaaS模式下,多租户之间的资源隔离是基础且关键的一环.SaaS服务商需要在确保运营效率和控制成本的前提下,搭建一个让多个租户能够同时访问的共享环境. 虽然大家都在用同一套Sa ...
- 【转载】【深度学习服务器组装】【DIY土豪級別電腦】1.5TB記憶體192核心384線程雙路EPYC9654+RTX4090=神豪的量化+深度學習電腦
视频地址: https://www.youtube.com/watch?v=_VMvGuVGI1M