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语言的方式,岂不是更好吗,所以花了一段时间,把网 ...
随机推荐
- 支付宝 APP登录 获取用户信息 PHP(转)
转载自:https://blog.csdn.net/wang78699425/article/details/78666401 支付宝 APP登录 获取用户信息 PHP(转) 支付宝APP登录服务端流 ...
- DOM 操作的常用 API 有哪些 ?
DOM 操作的常用 API 就是DOM 通过API (接口)获取页面(html)元素: 1. 节点查询 API 1.1 document.querySelector() 选择第一个匹配的元素 1.2 ...
- 鲲鹏(ARM64)+麒麟(Kylin v10)离线部署 KubeSphere
作者:社区用户-天行1st 本文将详细介绍,如何基于鲲鹏 CPU(ARM64) 和操作系统 Kylin V10 SP2/SP3,利用 KubeKey 制作 KubeSphere 和 Kubernete ...
- 基于云原生的私有化 PaaS 平台交付实践
作者:牛玉富,某知名互联网公司专家工程师.喜欢开源 / 热衷分享,对 K8s 及 golang 网关有较深入研究. 本文将解读如何利用云原生解决私有化交付中的问题,进而打造一个 PaaS 平台,提升业 ...
- HTTP常用返回结果状态码
摘编自<图解HTTP> HTTP状态码负责表示客户端 HTTP请求的返回结果.标记服务器端的处理是否正常.通知出现的错误等工作.状态码的职责是当客户端向服务器端发送请求时,描述返回的请求 ...
- docker网络管理--项目三
一.Docker网络概念 1.网络驱动 Docker 网络子系统使用可插拔的驱动,默认情况下有多个驱动程序,并提供核心联网功能. bridge:桥接网络,这是默认的网络驱动程序(不指定驱动程序创建的容 ...
- 海外SRC信息收集工具
海外SRC信息收集 子域名爆破工具:bbot,subfinder 相关测评:https://blog.blacklanternsecurity.com/p/subdomain-enumerat ...
- 【一步步开发AI运动小程序】九、姿态辅助调试桌面工具的使用
随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...
- WebLogic XMLDecoder反序列化漏洞
目录 前言 XMLDecoder概述 XMLDecoder反序列化漏洞 漏洞复现 前言 上篇复现了T3反序列化漏洞,XMLDecoder反序列化在WebLogic中也是一类影响很大的反序化漏洞. XM ...
- 高性能计算-gemm串行计算优化(3)
目标:Darknet 源码cpu矩阵乘法函数 gemm_nn 优化.参数说明:lda A的列数; ldb B的列数; ldc C的列数; M C的行数; K A的列数 测试方法:Darknet源码,m ...