美文网首页
第七十章 Caché 函数大全 $WEXTRACT 函数

第七十章 Caché 函数大全 $WEXTRACT 函数

作者: Cache技术分享 | 来源:发表于2020-10-30 07:18 被阅读0次

    第七十章 Caché 函数大全 $WEXTRACT 函数

    按位置从字符串中提取子字符串,或按位置替换子字符串,以识别代理项对。

    大纲

    $WEXTRACT(string,from,to)
    $WE(string,from,to)
    
    SET $WEXTRACT(string,from,to)=value
    SET $WE(string,from,to)=value
    

    参数

    • string 在其中标识子字符串的目标字符串。将字符串指定为计算结果为带引号的字符串或数字值的表达式。在SET $WEXTRACT语法中,字符串必须是变量或多维属性。
    • from 可选-目标字符串内的起始位置。字符从1开始计数。代理项对视为单个字符。允许值为n(将起始位置指定为从字符串开头开始的字符计数的正整数)、*(指定字符串中的最后一个字符)和*-n(从字符串末尾向后偏移字符的整数计数)。SET $WEXTRACT语法还支持*+n(超出字符串末尾的字符的偏移整数计数)。如果未指定,则默认值为1。双参数表单$WEXTRACT(String,From)和三参数表单$WEXTRACT(String,From,To):使用不同的值。不至:指定一个字符。要从字符串的开头开始计数,请指定一个计算结果为正整数(从1开始计数)的表达式;零(0)或负数将返回空字符串。要从字符串末尾开始计数,请指定** -n。如果忽略from,则默认为1。与至:指定字符范围的开始。要从字符串的开头算起,请指定一个计算结果为正整数(从1算起)的表达式。零(0)或负数的值为1。要从字符串末尾开始计数,请指定** -n
    • to 可选-指定字符范围的结束位置(含)。必须与from一起使用。允许的值是n(等于或大于的正整数,将结束位置指定为从字符串开头算起的字符数),*(指定字符串中的最后一个字符)和* -n(字符的偏移整数数)从字符串末尾向后)。代理对被视为单个字符。可以指定一个to值,该值超出字符串的末尾。SET $ WEXTRACT语法还支持* + n(要追加到字符串末尾的字符范围的末尾的偏移整数计数)。

    描述

    $WEXTRACT按位置标识字符串中的子字符串,从字符串开头算起字符或从字符串结尾算起偏移量。子字符串可以是单个字符或字符范围。 $WEXTRACT将代理对识别为单个字符。

    $WEXTRACT可以以两种方式使用:

    • 从字符串返回子字符串。这使用$WEXTRACT(string,from,to)语法。
    • 替换字符串中的子字符串。替换子字符串的长度可以与原始子字符串相同,更长或更短。这使用SET $WEXTRACT(string,from,to)=value语法。

    $WEXTRACT$EXTRACT在功能上相同,除了代理对的处理。

    代理对

    $WEXTRACT from和to参数将代理对视为单个字符。可以使用$WISWIDE函数确定字符串是否包含代理对。

    代理对是一对16位Caché字符元素,它们一起编码一个Unicode字符。代理对用于代表某些表意文字,这些表意文字用于中文,日文汉字和韩文汉字。 (大多数常用的中文,汉字和汉字字符由标准的16位Unicode编码表示。)代理对为日语JIS X0213:2004(JIS2004)编码标准和中文GB18030编码标准提供了Caché支持。

    代理对由在十六进制范围D800至DBFF中的高阶16位字符元素和在十六进制范围DC00至DFFF中的低阶16位字符元素组成。

    $WEXTRACT函数将代理对视为单个字符。 $EXTRACT函数将代理对视为两个字符。如果字符串不包含代理对,则可以使用$WEXTRACT$EXTRACT并返回相同的值。但是,由于$EXTRACT通常比$WEXTRACT快,因此对于不太可能遇到代理对的所有情况,$EXTRACT是更可取的。

    返回子串

    $WEXTRACT按字符串的字符位置返回子字符串。子字符串提取的性质取决于所使用的参数:

    • $WEXTRACT(string)提取字符串中的第一个字符。
    • $WEXTRACT(string,from)在from指定的位置提取单个字符。 from值可以是从字符串开头开始的字符的整数计数,可以是星号指定字符串的最后一个字符,也可以是带有负整数的星号指定从字符串末尾开始的字符计数。

    下面的示例从包含代理对的字符串中提取单个字母。请注意,$LENGTH将代理对视为两个字符,但是$WEXTRACT会将代理对视为单个字符:

    
    /// d ##class(PHA.TEST.Function).WEXTRACT()
    ClassMethod WEXTRACT()
    {
        IF $SYSTEM.Version.IsUnicode()  {
            SET hipart=$CHAR($ZHEX("D806"))
            SET lopart=$CHAR($ZHEX("DC06"))
            SET spair=hipart_lopart /* surrogate pair */
            WRITE "length of surrogate pair ",$LENGTH(spair),!
            SET mystr="AB"_spair_"DEFG"
            WRITE !,$WEXTRACT(mystr,4)    // "D" the 4th character
            WRITE !,$WEXTRACT(mystr,*)    // "G" the last character
            WRITE !,$WEXTRACT(mystr,*-5)  // "B" the offset 5 character from end
            WRITE !,$WEXTRACT(mystr,*-0)  // "G" the last character by 0 offset
        } ELSE {
            WRITE "此示例需要安装Unicode的Caché"
        }   
    
    DHC-APP>d ##class(PHA.TEST.Function).WEXTRACT()
    length of surrogate pair 2
     
    D
    G
    B
    G
    
    • $WEXTRACT(string,from,to)提取以from位置开始,以to位置(包括)结束的字符范围。以下$WEXTRACT函数都返回字符串“Alabama”,将代理对视为单个字符:
    /// d ##class(PHA.TEST.Function).WEXTRACT1()
    ClassMethod WEXTRACT1()
    {
        IF $SYSTEM.Version.IsUnicode()  {
            SET hipart=$CHAR($ZHEX("D806"))
            SET lopart=$CHAR($ZHEX("DC06"))
            SET spair=hipart_lopart /* surrogate pair */
            SET var2=spair_"XXX"_spair_"Alabama"_spair
            WRITE !,$WEXTRACT(var2,6,12)
            WRITE !,$WEXTRACT(var2,*-7,*-1)
        } ELSE {
            WRITE "This example requires a Unicode installation of Caché"
        }
    }
    
    DHC-APP>d ##class(PHA.TEST.Function).WEXTRACT1()
     
    Alabama
    Alabama
    

    如果from和to位置相同,则$WEXTRACT返回单个字符。如果to位置比from位置更靠近字符串的开头,则$WEXTRACT返回空字符串。

    替换子字符串

    可以将$WEXTRACTSET命令一起使用,以另一个值替换指定的字符或字符范围。也可以使用它在字符串末尾附加字符。 SET $WEXTRACT将代理对视为单个字符。

    $WEXTRACT与等号左侧的SET一起使用时,字符串可以是有效的变量名。如果该变量不存在,则SET $WEXTRACT对其进行定义。字符串参数也可以是多维属性引用。它不能是非多维对象属性。尝试在非多维对象属性上使用SET $WEXTRACT会导致<OBJECT DISPATCH>错误。

    如果函数使用相对偏移语法,则不能将SET (a,b,c,...)=value 语法与等号左侧的$WEXTRACT(或$EXTRACT$PIECE$LIST)一起使用:代表字符串的结尾,*-n* + n代表距字符串结尾的相对偏移量。必须改为使用SET a=value,b=value,c=value,...语法。

    示例

    下面的示例显示$WEXTRACT的两参数形式,返回代理对的Unicode值:

    /// d ##class(PHA.TEST.Function).WEXTRACT2()
    ClassMethod WEXTRACT2()
    {
        IF $SYSTEM.Version.IsUnicode()  {
            SET hipart=$CHAR($ZHEX("D806"))
            SET lopart=$CHAR($ZHEX("DC06"))
            SET spair=hipart_lopart /* surrogate pair */
            SET x="ABC"_spair_"DEFGHIJK"
            WRITE !,"$EXTRACT character "
            ZZDUMP $EXTRACT(x,4)
            WRITE !,"$WEXTRACT character "
            ZZDUMP $WEXTRACT(x,4)
        } ELSE {
            WRITE "This example requires a Unicode installation of Caché"
        }
    }
    
    DHC-APP>d ##class(PHA.TEST.Function).WEXTRACT2()
     
    $EXTRACT character
    0000: D806
      ZZDUMP $EXTRACT(x,4)
      ^
    <STORE>zWEXTRACT2+7^PHA.TEST.Function.1
    

    下面的示例显示$WEXTRACT的三参数形式,包括子字符串范围内的代理对:

    /// d ##class(PHA.TEST.Function).WEXTRACT3()
    ClassMethod WEXTRACT3()
    {
        IF $SYSTEM.Version.IsUnicode()  {
            SET hipart=$CHAR($ZHEX("D806"))
            SET lopart=$CHAR($ZHEX("DC06"))
            SET spair=hipart_lopart /* surrogate pair */
            SET x="ABC"_spair_"DEFGHIJK"
            WRITE !,"$EXTRACT two characters "
            ZZDUMP $EXTRACT(x,3,4)
            WRITE !,"$WEXTRACT two characters "
            ZZDUMP $WEXTRACT(x,3,4)
        } ELSE {
            WRITE "This example requires a Unicode installation of Caché"
        }
    }
    
    DHC-APP>d ##class(PHA.TEST.Function).WEXTRACT3()
     
    $EXTRACT two characters
    0000: 0043 D806                                               C
      ZZDUMP $EXTRACT(x,3,4)
      ^
    <STORE>zWEXTRACT3+7^PHA.TEST.Function.1
    

    相关文章

      网友评论

          本文标题:第七十章 Caché 函数大全 $WEXTRACT 函数

          本文链接:https://www.haomeiwen.com/subject/afyrvktx.html