FAQ > 金融建模 > 建模问题 > 其他

Q:天软中中文(汉字)字符的匹配常用处理方式    

  • A:一般常用的字符串函数都是基于单字符字符串进行处理的,当遇到中文时则可能无法正常处理。
    天软中中文字符为多字节字符串,一般处理这类字符串则需要使用多字节字符串支持函数。

    即,一般字符串函数,暂且叫“英文字符串”处理函数,而处理带中文的字符串函数,我们叫“多字节字符串”处理函数。
    这两类函数常见的区别为:在英文字符串处理函数中,一个中文字符(如汉字)占多个字节即处理成多个字符,而在多字节函数中一个汉字处理成一个字符
    注:也可能存在特殊情况,具体请参与函数说明为准。
    在天软中,对应单字节与多字节常用处理模型对照如下:
    英文字符串多字节字符串功能多字节函数区别说明
    lengthlengthw计算字符串长度一个汉字占一个长度
    LeftBStrLeftStr从左侧开始取指定长度的子串一个汉字占一个长度
    RightBStrRightStr从右侧开始取指定长度的子串一个汉字占一个长度
    MidBStrMidStr从指定位置开始取指定长度的子串一个汉字占一个长度
    PosAnsiPos查找指定串在另一个串中的开始位置一个汉字占一个长度
    Str2ArrayAnsiStr2Array将字符串按指定字符分割成一个数组多字节中分割符支持中文字符
    ReplaceStrAnsiReplaceStr字符串的部分替换,大小写敏感
    ReplaceTextAnsiReplaceText字符串的部分替换,大小写不敏感


    另外在正则中,对于匹配串中存在中文字符的,则需要将匹配串与原串转为Unicode后进行。

    一般应用举例如下:

    示例01:【英文字符串函数】与【多字节字符串函数】的效果对比
    s:="场景编辑【pid:666】";
    echo "单字节:",length(s);
    echo "多字节:",lengthw(s);
    return 1;

    打印效果如下:
    单字节:19
    多字节:13
    解析:字符串s中,存在"场景编辑【】"共6个中文字符,因此单字节计算出的长度比多字节的多6个。

    下面示例主要描述中文字符的处理场景。
    示例02:取子串
    一般可用于知道要取的串的固定位置及长度
    s:="场景编辑【pid:666】";
    return MidStr(s,6,3);

    返回字符串:pid

    示例03:查找子串的位置
    一般可用于判断串中是否存在某个字符
    s:="场景编辑【pid:666】";
    return AnsiPos("【",s);

    返回数字:5

    示例04:获取指定串后的子串
    一般用于获取符合某个格式的内容
    s:="场景编辑【pid:666】";
    p1:= AnsiPos("【",s);
    p2:= AnsiPos("】",s);
    return midStr(s,p1+1,p2-p1-1);

    返回字符串:pid:666

    示例05:将字符串按某个中文字符进行切割成数组
    一般可用于格式化串进行批量解析
    s:="场景编辑【pageid:P906892】场景详情【comid:P906892001】xxx";
    return AnsiStr2Array(s,"】");

    返回数组:


    示例06:中文字符的替换
    s:='和顺电气;大通退';
    return AnSIReplaceStr(s,"退","T");

    返回字符串:和顺电气;大通T
    此时,若用return ReplaceStr(s,"退","T");则会产生乱码。

    示例07:正则中匹配串含中文字符
       title := "场景编辑【pageid:P906892】,场景详情【comid:P906892001】";
       regDef := '【([\\w]+):([\\w]+)】';
       //将匹配串与源串转成Unicode字符
       title_L := multibytetounicodew(title, 936);
       regDef_L := multibytetounicodew(regDef, 936);
       r:=parseregexpr(regDef_L, title_L, '', m);
       //此时m数组中存放的都是Unicode字符,需要转成多字节字符串
       if r then
        m::=UnicodeToMultiByte(mcell,936);
       else return "匹配失败";
       return m;

    返回结果:


    相关FAQ:
    FAQ:Q:天软中如何正确判断中文(汉字)字符串?
    FAQ:Q:用匹配串[^\u4e00-\u9fa5]+匹配汉字报错:unbalanced [] at offset 2