0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

nuere-简单小巧快速的字符串解析库

jf_wN0SrCdH 来源: Rust语言中文社区 2023-08-14 09:54 次阅读

neure是一个简单小巧的字符串解析库, 我在开发aopt时为了优化编译时间而开发的替代regex的库. 目前代码架构非常简单, 性能上比regex更快, 和nom的速度不相上下. 设计上参考了regex.Readme有一个和regex比较的代码,可以尝试一下.

https://github.com/araraloren/neure

补充一个和nom例子比较的代码,开启lto=fat时性能不相上下

use neure::*;
use nom::{
    bytes::{tag, take_while_m_n},
    combinator::map_res,
    sequence::tuple,
    IResult,
};

#[derive(Debug, PartialEq)]
pub struct Color {
    pub red: u8,
    pub green: u8,
    pub blue: u8,
}

fn from_hex(input: &str) -> Result {
    u8::from_str_radix(input, 16)
}

fn is_hex_digit(c: char) -> bool {
    c.is_digit(16)
}

fn hex_primary(input: &str) -> IResult<&str, u8> {
    map_res(take_while_m_n(2, 2, is_hex_digit), from_hex)(input)
}

fn hex_color(input: &str) -> IResult<&str, Color> {
    let (input, _) = tag("#")(input)?;
    let (input, (red, green, blue)) = tuple((hex_primary, hex_primary, hex_primary))(input)?;

    Ok((input, Color { red, green, blue }))
}

fn main() -> Result<(), Box> {
    let mut storer = SpanStorer::new(1);
    let color_str = "#2F14DF";
    let parser = |storer: &mut SpanStorer, str: &str| -> Result<(), neure::Error> {
        let pound = neure!('#');
        let hex = neure!(['0' - '9' 'A' - 'F']{2});
        let mut ctx = CharsCtx::default().with_str(str);

        ctx.reset();
        ctx.try_mat(£)?;
        ctx.try_cap(0, storer, &hex)?;
        ctx.try_cap(0, storer, &hex)?;
        ctx.try_cap(0, storer, &hex)?;
        Ok(())
    };

    measure(100000, 100000, || {
        if parser(storer.reset(), color_str).is_ok() {
            let mut strs = storer.substrs(color_str, 0).unwrap();
            assert_eq!(
                Color {
                    red: u8::from_str_radix(strs.next().unwrap(), 16).unwrap(),
                    green: u8::from_str_radix(strs.next().unwrap(), 16).unwrap(),
                    blue: u8::from_str_radix(strs.next().unwrap(), 16).unwrap(),
                },
                Color {
                    red: 47,
                    green: 20,
                    blue: 223,
                }
            );
            1
        } else {
            0
        }
    });

    measure(100000, 100000, || {
        if hex_color("#2F14DF").unwrap()
            == (
                "",
                Color {
                    red: 47,
                    green: 20,
                    blue: 223,
                },
            )
        {
            1
        } else {
            0
        }
    });
    Ok(())
}

pub fn measure(n: usize, size: usize, mut f: impl FnMut() -> i32) {
    use std::Instant;

    let start = Instant::now();
    let mut sum = 0;
    for _ in 0..n {
        sum += f();
    }
    let time = start.elapsed();
    println!(
        "Size = {size}, Cost time {} with test {} times: {} --> {}",
        time.as_secs_f64(),
        n,
        time.as_secs_f64() / n as f64,
        sum,
    );
}

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 字符串
    +关注

    关注

    1

    文章

    552

    浏览量

    20132
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66784
  • 编译
    +关注

    关注

    0

    文章

    615

    浏览量

    32397
  • GitHub
    +关注

    关注

    3

    文章

    457

    浏览量

    15924

原文标题:【大家的项目】nuere - 简单小巧快速的字符串解析库

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LABVIEW字符串转换为UTF-8编码字符串

    ,在这个中就包含了上述函数。的具体位置如下图所示:这个中的许多VI都使用了一个内置函数“"文本至UTF-8转换”。该函数可以把LABVIEW字符串转换为UTF-8编码的
    发表于 06-06 15:16

    怎么按分隔符来解析字符串

    字符串里的内容是1,2,3,4我想按分隔符来解析解析结果是
    发表于 03-19 10:33

    数据转换、SQL存储,十六进制字符串、正常字符串

    到了这个方法。方法:将所有乱码的 ,不乱码的数据显示成十六进制,如下图所示,把正常显示的字符串更换为16进制显示,当显示为16进制字符串时,字符串的显示字符组成仅为1-F的
    发表于 05-27 10:29

    80路串口(230400波特率)同时采集,同时解析,怎么将采集到的字符串解析??

    80路串口(230400波特率)同时采集,同时解析,怎么将采集到的字符串解析,目前的思路是一个线程专门读串口采集将读取的用连接字符串连接起来存在全局变量里,另一个线程专门
    发表于 04-30 08:58

    如何实现字符串函数?

    你好 我使用STM8S发现套件和标准固件。我需要使用字符串函数,如strtok()。如何让这些功能在这种环境中工作。包括string.h不会工作。我需要实现字符串函数还是有更简单的方
    发表于 07-09 08:37

    labview字符串转换

    ` 本帖最后由 jingzhaojun1986 于 2020-6-12 13:58 编辑 ,这个多用于协议解析,主要实现了16进制字符串到正常字符串的显示正常
    发表于 05-19 11:50

    怎样去查找字符串

    估计也不高,差不多就行了。作用:其实就是字符串的查找,然后提对应字符串的数据出来。随便创建一组数组,模拟单片机中接收的数据。 1 char j = '1'; 2 str[0] ...
    发表于 07-14 07:02

    如何去解析单片机的字符串命令呢?

    如何去解析字符串命令呢?有哪些方法呢?如何对字符串命令进行测试?
    发表于 07-14 06:43

    荣小菜补钙记第45期:报文合成与解析之十六进制字符串与常显字符串的互映射转换

    看44期内容。2. 字符串映射转换_正常显示转十六进制显示对于报文,我们推荐尽量将字符串报文转换并保持为数值或数值数组来进行数据处理,快速方便简单。但是,总会遇到有“哎呀已经写成这样没
    发表于 09-11 21:21

    如何解析字符串命令?

    如何解析字符串命令?
    发表于 10-21 09:28

    如何去制作c与c标准、数组与字符串

    《c语言深度解析》第5、6章 制作c与c标准、数组与字符串 2008年毕...
    发表于 12-23 07:11

    字符串的相关资料分享

    赋给固定的变量。经典的应用比如知名的grbl固件的G代码解析固件https://github.com/grbl/grbl以及GPS报文解析tinygpshttps://github.com/mikalhart/TinyGPSP
    发表于 01-14 09:02

    介绍一种简单的数据解析方法

    JSON。​ 下面我将介绍一种简单的数据解析方法,通过编写函数,将字符串解析取得目标数据。解析字符
    发表于 02-28 06:15

    聊聊字符串

    就是字符格式。有些场景需要使用多个处理器协同工作,比如单片机+openmv,它们之间需要通信,可以采用字符格式的编码方式。操作字符串,无非是两件事儿:生成字符串
    发表于 02-28 06:52

    C语言总结_字符串全方位练习

    C语言字符串全方位练习,涉及知识点:字符串解析、大小写判断、字符串插入、字符串删除、字符串排序、
    的头像 发表于 08-14 09:41 1167次阅读