推荐一个文本解析开源工具: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. [快速阅读八] HDR->LDR:Matlab中tonemapfarbman函数的解析和自我实现。

    最近受朋友的委托,想自己实现Matlab里的一个HDR转LDR的函数,函数名是tonemapfarbman,乘着十一假期,稍微浏览下这个函数,并做了一点C++的实现和优化. 为了看到这个函数的效果,需 ...

  2. 使用VNC连接ubuntu16.4错误Authentication Failure问题

    解决办法:是因为vnc用一套自己的密码系统,不要去输入ssh登录时的密码,所以只需要进入远程服务器中,设置一哈vnc的密码即可! 在终端输入命令:vncpasswd 到此可以试试远程

  3. Notepad--特色功能:拷贝另存为

    Notepad--特色功能:拷贝另存为 你是否纠结如下的使用场景: 正在编辑的文件,还没有想好,保存担心把原文件给覆盖了. 使用"另存为"后当前编辑界面的文档又变成新的文件了,可是 ...

  4. ArgoWorkflow教程(七)---高效的步骤间文件共享策略

    之前我们分析了使用 artifact 实现步骤间文件共享,今天分享一下如何使用 PVC 实现高效的步骤间文件共享. 1. 概述 之前在 artifact 篇我们演示了如何使用 artifact 实现步 ...

  5. Python3开启简易服务器

    nohup python3 -m http.server 3000 2>&1 &

  6. 局部加权回归(Lowess)

    代码示例:(源自:https://blog.csdn.net/weixin_71158509/article/details/136060826) import numpy as np import ...

  7. 2.9 使用系统光盘修复Linux系统

    如果系统错误已经导致单用户模式不能进入了,那么是否需要重新安装Linux 系统?不用着急,为了应对单用户模式也无法修复的错误,Linux 系统提供了 rescue 救援(光盘修复)模式. rescue ...

  8. Chapter12 动态内存与智能指针

    目录 12.1.0 介绍 12.1.1 shared_ptr类 make_shared函数 shared_ptr的拷贝和引用 shared_ptr自动销毁所管理的对象- -shared_ptr还会自动 ...

  9. Abp源码分析之Abp本地化

    aspnetcore mvc 实现本地化 新建mvc项目 修改Program.cs using Microsoft.AspNetCore.Localization; using Microsoft.A ...

  10. Python预安装包制作

    预编译安装包 在Linux服务器上,经常会安装Python.Redis.Nginx等服务,不管离线.在线都需要编译.编译之前还需要安装一些依赖的环境,比如,openssl.gcc.g++等,但是mak ...