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

    文章

    578

    浏览量

    20506
  • 代码
    +关注

    关注

    30

    文章

    4779

    浏览量

    68519
  • 编译
    +关注

    关注

    0

    文章

    657

    浏览量

    32851
  • GitHub
    +关注

    关注

    3

    文章

    468

    浏览量

    16427

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

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

收藏 人收藏

    评论

    相关推荐

    字符串的表示

    字符串的表示  随着计算机在文字处理与信息管理中的广泛应用, 字符串已成为最常用的数据类型之一, 许多计算机中都提供字符串操作功能, 一些计算机还给出读写字
    发表于 10-13 17:11 3064次阅读
    <b class='flag-5'>字符串</b>的表示

    实例解析Java字符串内存管理方法

    Java[1]语言为字符串操作提供了丰富的支持,它将字符串封装在三个类中并提供多种字符串操作接口。在Java应用程序中,由于对字符串的使用量比较高,从而使得其需要消耗较大的堆空间。例如
    发表于 10-27 10:20 1次下载
    实例<b class='flag-5'>解析</b>Java<b class='flag-5'>字符串</b>内存管理方法

    字符串移位包含的问题解决方案

    问题:给定字符串s和t,判断是否字符串t能通过将s移位后的字符串所包含。 方法一 最简单的方法就是将s进行循环移位,再判断移位后的字符串是否
    发表于 11-29 10:05 1044次阅读

    什么是复制字符串?Python如何复制字符串

    连续几篇文章都在写 Python 字符串,这出乎我的意料了。但是,有的问题,不写不行,特别是那种灵机一动想到的问题,最后你发现,很多人根本不懂却又误以为自己懂了。那就继续刨根问底,探究个明白吧
    发表于 11-25 10:32 3011次阅读

    strtok拆分字符串

    就是字符格式。有些场景需要使用多个处理器协同工作,比如单片机+openmv,它们之间需要通信,可以采用字符格式的编码方式。操作字符串,无非是两件事儿:生成字符串
    发表于 01-13 15:46 8次下载
    strtok拆分<b class='flag-5'>字符串</b>

    字符串操作

    labview字符串操作
    发表于 06-28 15:09 2次下载

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

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

    关于STEP7功能字符串转换

    libraries---Standard Libray---TI-S7 Converting Blocks) FC编号 功能名称 描述 FC5 DI_STRING 双整数转字符串 FC16
    的头像 发表于 10-10 10:50 4206次阅读

    链式存储字符串简单实现

    除了顺序,还有链,所谓链,就是链式存储的字符串
    的头像 发表于 01-18 10:51 1273次阅读
    链式存储<b class='flag-5'>字符串</b>的<b class='flag-5'>简单</b>实现

    python字符串有哪些特定方法

    python字符串序列操作也适用于列表和元组。 python字符串还有独有方法,即字符串对象的函数,其他对象不可调用,只有字符串对象可调用。
    的头像 发表于 02-23 15:02 703次阅读

    字符串的相关知识

    TCL 中的数据类型只有一种:字符串。这些字符串可以是字母、数字、布尔值、标点符号等特殊字符的组合。在某些特殊命令的作用下,字符串可以向其他数据类型转换。下面将系统的讲解或回顾下
    的头像 发表于 03-29 11:41 1144次阅读

    mysql字符串包含某个字符串

    MySQL是一种开源的关系型数据管理系统,被广泛用于构建Web应用程序和其他大型数据驱动的应用。在进行MySQL数据查询时,经常需要使用字符串包含操作,即判断一个字符串是否包含另一
    的头像 发表于 11-16 14:52 3783次阅读

    MySQL替换字符串函数REPLACE

    MySQL是目前非常流行的开源数据管理系统之一,它具有强大的功能和性能。其中之一的字符串函数REPLACE,可以用于替换字符串中的指定字符字符串
    的头像 发表于 11-30 10:44 1544次阅读

    oracle判断字符串包含某个字符

    字符串操作是任何编程语言中都非常重要的一部分,Oracle数据作为目前最常用的关系型数据之一,也提供了丰富的字符串操作函数和方法。在本文中,我们将详细
    的头像 发表于 12-06 09:53 1.5w次阅读

    oracle字符串split成多个

    Oracle是一种广泛使用的关系型数据管理系统,它提供了许多强大的功能和函数,用于处理和操作数据。其中之一就是字符串分割(split)方法,该方法用于将一个字符串按照指定的分隔符分割成多个子
    的头像 发表于 12-06 09:54 5272次阅读