热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

lua提取字符串操作可以用在c程序当中2

增加了str_findstr_gsub两个函数测试如下str_gsub(yangzm32zm,zm,12);str_find(yangzm,zm);st

// 增加了 str_find  str_gsub  两个函数

// 测试如下

//    str_gsub( "yangzm 32zm", "zm", "12" );
//    str_find( "yangzm", "zm" );


static const char *lmemfind (const char *s1, size_t l1,

                             const char *s2, size_t l2)

{

    if (l2 == 0) return s1;  /* empty strings are everywhere */

    else if (l2 > l1) return NULL;  /* avoids a negative `l1' */

    else {

        const char *init;  /* to search for a `*s2' inside `s1' */

        l2--;  /* 1st char will be checked by `memchr' */

        l1 = l1-l2;  /* `s2' cannot be found after that */

        while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) {

            init++;   /* 1st char is already checked */

            if (memcmp(init, s2+1, l2) == 0)

                return init-1;

            else {  /* correct `l1' and `s1' to try again */

                l1 -= init-s1;

                s1 = init;

            }

        }

        return NULL;  /* not found */

    }

}



bool str_find( const char* s, const char* p, int pos = 1 )

{

    size_t ls,lp;

    ls = strlen( s );

    lp = strlen( p );

    

    size_t init = posrelat( pos, ls );

    if (init <1) init &#61; 1;

    else if (init > ls &#43; 1) {  /* start after string&#39;s end? */

        //lua_pushnil(L);  /* cannot find anything */

        return false;

    }



    const char *s2 &#61; lmemfind(s &#43; init - 1, ls - init &#43; 1, p, lp);

    if ( s2 )

    {

        size_t pa &#61; s2 - s &#43; 1;

        size_t pb &#61; s2 - s &#43; lp;

        return true;

    }

    

    //if (s2) {

        //lua_pushinteger(L, s2 - s &#43; 1);

        //lua_pushinteger(L, s2 - s &#43; lp);

        //return 2;

    //}



    return false;

}



static void push_onecapture (MatchState *ms, int i, const char *s, const char *e)

{

    if (i >&#61; ms->level)

    {

        if (i &#61;&#61; 0)  /* ms->level &#61;&#61; 0, too */

        {

            //lua_pushlstring(ms->L, s, e - s);  /* add whole match */

        }

        else

            printf("invalid capture index");

    }

    else

    {

        ptrdiff_t l &#61; ms->capture[i].len;

        if (l &#61;&#61; CAP_UNFINISHED)

            printf("unfinished capture");

        

        if (l &#61;&#61; CAP_POSITION)

        {

            //lua_pushinteger(ms->L, ms->capture[i].init - ms->src_init &#43; 1);

        }

        else

        {

            //lua_pushlstring(ms->L, ms->capture[i].init, l);

        }

    }

}



std::string str_gsub( const char* src, const char*p, const char* ne, int max_ &#61; 0 )

{

    size_t srcl, lp;

    srcl &#61; strlen(src);

    lp &#61; strlen(p);

    

    int anchor &#61; (*p &#61;&#61; &#39;^&#39;);

    if (anchor) {

        p&#43;&#43;; lp--;

    }



    size_t max_s;

    

    if ( max_ &#61;&#61; 0 )

        max_s &#61; srcl &#43; 1;

    else

        max_s &#61; max_;

    

    size_t n &#61; 0;

    MatchState ms;

    

    ms.matchdepth &#61; MAXCCALLS;

    ms.src_init &#61; src;

    ms.src_end &#61; src&#43;srcl;

    ms.p_end &#61; p &#43; lp;



    std::string strb;

    

    while (n
    {

        const char *e;

        ms.level &#61; 0;

        //lua_assert(ms.matchdepth &#61;&#61; MAXCCALLS);

        e &#61; match(&ms, src, p);

        if (e) {

            n&#43;&#43;;

            //add_value(&ms, &b, src, e, tr);

            size_t l, i;

            const char *news &#61; ne;

            l &#61; strlen( news );

            

            for (i &#61; 0; i
                if (news[i] !&#61; L_ESC)

                    //luaL_addchar(b, news[i]);

                    strb &#43;&#61; news[i];

                else {

                    i&#43;&#43;;  /* skip ESC */

                    if (!isdigit(uchar(news[i]))) {

                        if (news[i] !&#61; L_ESC)

                            printf("invalid use of in replacement string");

                        //luaL_addchar(b, news[i]);

                        strb &#43;&#61; news[i];

                    }

                    else if (news[i] &#61;&#61; &#39;0&#39;)

                    {

                        std::string str &#61; src;

                        str &#61; str.substr( e - src, str.size() - ( e-src ) );

                        strb.append( str );

                        //luaL_addlstring(b, s, e - s);

                    }

                    else {

                        push_onecapture(&ms, news[i] - &#39;1&#39;, src, e);

                        //luaL_addvalue(b);  /* add capture to accumulated result */

                    }

                }

            }



        }

        if (e && e>src)

            src &#61; e;

        else if (src
        {

            //luaL_addchar(&b, *src&#43;&#43;);

            strb &#43;&#61; *src&#43;&#43;;

        }

        else break;

        if (anchor) break;

    }



    return strb;

}






推荐阅读
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 如何在Lua中调用C语言编译的动态链接库
    本文介绍了如何在Lua中调用C语言编译的动态链接库。通过详细步骤和示例代码,帮助开发者理解和掌握这一技术。参考了《Lua编程入门》一书中的相关内容,并结合实际操作经验,提供了更加清晰和实用的指导。此外,还探讨了在不同操作系统下编译和链接Lua的方法,为跨平台开发提供了有价值的参考。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 三角测量计算三维坐标的代码_双目三维重建——层次化重建思考
    双目三维重建——层次化重建思考FesianXu2020.7.22atANTFINANCIALintern前言本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 在Delphi7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本。定义如下:1234 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • poj 3352 Road Construction ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • 本文全面解析了 Python 中字符串处理的常用操作与技巧。首先介绍了如何通过 `s.strip()`, `s.lstrip()` 和 `s.rstrip()` 方法去除字符串中的空格和特殊符号。接着,详细讲解了字符串复制的方法,包括使用 `sStr1 = sStr2` 进行简单的赋值复制。此外,还探讨了字符串连接、分割、替换等高级操作,并提供了丰富的示例代码,帮助读者深入理解和掌握这些实用技巧。 ... [详细]
  • 本文探讨了利用JavaScript实现集合的对称差集算法的方法。该算法旨在处理多个数组作为输入参数,同时保留每个数组中元素的原始顺序。算法不会移除单个数组内的重复元素,但会删除在不同数组之间出现的重复项。通过这种方式,能够有效地计算出多个数组的对称差集。 ... [详细]
  • 寒假作业解析:第三周 2月12日 第7题
    尽快完成之前的练习任务!每日一练2.1 Problem A Laurenty and Shop 的题目要求是选择两条不同的路线以最小化总的等待时间。简要分析:通过对比不同路线的等待时间,可以找到最优解。此问题可以通过动态规划或贪心算法来解决,具体取决于路线的复杂性和约束条件。 ... [详细]
author-avatar
与爱情无关于寂寞有染_973
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有