热门标签 | 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;

}






推荐阅读
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文探讨了如何在模运算下高效计算组合数C(n, m),并详细介绍了乘法逆元的应用。通过扩展欧几里得算法求解乘法逆元,从而实现除法取余的计算。 ... [详细]
  • 本文详细介绍了Java中的访问器(getter)和修改器(setter),探讨了它们在保护数据完整性、增强代码可维护性方面的重要作用。通过具体示例,展示了如何正确使用这些方法来控制类属性的访问和更新。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • 使用Pandas高效读取SQL脚本中的数据
    本文详细介绍了如何利用Pandas直接读取和解析SQL脚本,提供了一种高效的数据处理方法。该方法适用于各种数据库导出的SQL脚本,并且能够显著提升数据导入的速度和效率。 ... [详细]
  • 在现代Web应用中,当用户滚动到页面底部时,自动加载更多内容的功能变得越来越普遍。这种无刷新加载技术不仅提升了用户体验,还优化了页面性能。本文将探讨如何实现这一功能,并介绍一些实际应用案例。 ... [详细]
  • 本文探讨了如何在iOS开发环境中,特别是在Xcode 6.1中,设置和应用自定义文本样式。我们将详细介绍实现方法,并提供一些实用的技巧。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
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社区 版权所有