第十四章 Caché 函数大全 $EXTRACT 函数

第十四章 Caché 函数大全 $EXTRACT 函数

按位置从字符串中提取子字符串,或按位置替换子字符串。

大纲

$EXTRACT(string,from,to)
$E(string,from,to)

SET $EXTRACT(string,from,to)=value
SET $E(string,from,to)=value

参数

  • string 标识子字符串的目标字符串。将字符串指定为计算结果为带引号的字符串或数字值的表达式。在SET $EXTRACT语法中,字符串必须是变量或多维属性。
  • from 可选-指定目标字符串中的起始位置。字符从1开始计算。允许的值为n(一个正整数,指定从字符串开头的字符计数),*(指定字符串中的最后一个字符)和* -n(从字符串末尾向后偏移的字符整数)。SET $EXTRACT语法还支持* + n(附加在字符串末尾的偏移量整数字符)。从(不含)到的值指定单个字符。从到的从指定字符范围。如果未指定from,则默认为1。
  • to 可选-指定字符范围的结束位置(含)。必须与from一起使用。允许的值为n(指定从字符串开头开始的字符计数的正整数),*(指定字符串中的最后一个字符)和* -n(从字符串末尾向后偏移的字符整数)。SET $EXTRACT语法还支持* + n(要追加到字符串末尾的字符范围的末尾的偏移整数计数)。

描述

$EXTRACT通过字符串计数(从字符串的开头或字符串的结尾)识别字符串中的子字符串。子字符串可以是单个字符或字符范围。

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

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

返回子字符串

$EXTRACT按字符串中的字符位置返回子字符串。该子字符串提取的性质取决于使用的参数。

  • $Extract(String)提取字符串中的第一个字符。
DHC-APP>SET mystr="ABCD"
 
DHC-APP>WRITE $EXTRACT(mystr)
A
  • $Extract(string,from)在from指定的位置提取单个字符。From值可以是从字符串开头开始的整数计数,可以是指定字符串最后一个字符的星号,也可以是具有指定从字符串末尾向后计数的负整数的星号。

以下示例从字符串“ABCD”中提取单个字母:

DHC-APP>SET mystr="ABCD"

DHC-APP>WRITE !,$EXTRACT(mystr,2)
 
B
DHC-APP>WRITE !,$EXTRACT(mystr,*)
 
D
DHC-APP>WRITE !,$EXTRACT(mystr,*-2)
 
B
DHC-APP>WRITE !,$EXTRACT(mystr,*-0)
 
D
  • $EXTRACT(string,from,to)提取从from位置开始到to位置(包括)的字符范围。例如,如果变量var2包含字符串“1234Alabama567”,则以下$EXTRACT函数都将返回字符串“Alabama”:
DHC-APP>SET var2="1234Alabama567"
 
DHC-APP> WRITE !,$EXTRACT(var2,5,11)
 
Alabama
DHC-APP>WRITE !,$EXTRACT(var2,*-9,*-3)
 
Alabama

参数

string

标识子字符串的目标字符串。

当使用$EXTRACT返回子字符串时,字符串可以是用引号引起来的字符串文字,规范的数字,变量,对象属性或任何求值为字符串或数字的有效ObjectScript表达式。如果将空字符串(“”)指定为目标字符串,则$EXTRACT始终返回该空字符串,而不考虑其他参数值。

$EXTRACT与等号左侧的SET一起使用以替换子字符串时,string可以是变量名或多维属性引用;它不能是非多维对象属性。

from

from参数可以指定单个字符或字符范围的开头。

  • 如果from为n(正整数),则$EXTRACT从字符串的开头开始计算字符。
  • 如果from是*(星号),则$EXTRACT返回字符串中的最后一个字符。
  • 如果from是* -n(一个星号后跟一个负数),则$EXTRACT将从字符串末尾开始的偏移量计算字符。因此,*-0是字符串中的最后一个字符,*-1是字符串中的倒数第二个字符(从末尾偏移1)。
  • 仅适用于SET $EXTRACT语法—如果from是* + n(星号后跟一个正数),则SET $EXTRACT会在字符串的末尾附加偏移量。因此,* + 1在字符串末尾附加一个字符,* + 2在字符串末尾两个位置附加一个字符,将跳过的位置用空格填充。 * + 0是字符串中的最后一个字符。

如果from整数值大于字符串中的字符数,则$EXTRACT返回空字符串。使用从* -n的值,如果n等于或大于字符串中的字符数,则$EXTRACT返回空字符串。如果from值为0或负数,则$EXTRACT返回空字符串;但是,如果将from与to一起使用,则from值0或负数将被视为1值。

如果将from与to参数一起使用,则from标识要提取的范围的开始,并且必须小于to的值。如果从等于等于,则$EXTRACT返回指定位置的单个字符。如果from大于to,则$EXTRACT返回一个空字符串。如果与to参数一起使用,则from值小于1(零或负数)将被视为数字1。

to

to参数必须与from参数一起使用。它必须是正整数,*(星号)或* -n(星号后跟负整数)。如果to值是大于或等于from值的整数,则$EXTRACT返回指定的子字符串。如果to值为星号,则$EXTRACT返回子字符串,该子字符串以from字符开始,直至字符串的末尾。如果to是大于字符串长度的整数,则$EXTRACT还将返回子字符串,该子字符串以from字符开始,直到字符串的末尾。

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

如果省略to参数,则仅返回一个字符。如果指定了from,则$EXTRACT返回由from标识的字符。如果同时省略了to和from,则$EXTRACT返回字符串的第一个字符。

仅适用于SET $EXTRACT语法—如果to为* + nSET $EXTRACT会在字符串的末尾附加偏移量的字符范围,并根据需要用空格填充。如果from表示字符串末尾的字符位置,则SET $EXTRACT将附加字符。如果from表示字符串末尾之前的字符位置,则SET $EXTRACT可以替换和附加字符。

指定* -n和* + n参数值

使用变量指定* -n* + n时,必须始终在参数本身中指定星号和符号字符。

以下是* -n的有效格式:

DHC-APP>SET count=2
 
DHC-APP>SET alph="abcd"
 
DHC-APP>WRITE $EXTRACT(alph,*-count)
b
DHC-APP>SET count=2
 
DHC-APP>SET alph="abcd"
 
DHC-APP>WRITE $EXTRACT(alph,*+count)
 

以下是* +n的有效格式:

DHC-APP>SET count=2
 
DHC-APP>SET alph="abcd"
 
DHC-APP>SET $EXTRACT(alph,*+count)="F"
 
DHC-APP>WRITE alph
abcd F

这些参数值内允许使用空格。

示例:返回子字符串

以下示例返回“D”,即字符串中的第四个字符:

DHC-APP>SET x="ABCDEFGHIJK"
 
DHC-APP>WRITE $EXTRACT(x,4)
D

以下示例返回“K”,即字符串中的最后一个字符:

DHC-APP>SET x="ABCDEFGHIJK"
 
DHC-APP>WRITE $EXTRACT(x,*)
K

在下面的示例中,所有$EXTRACT函数都将“J”返回字符串中的倒数第二个字符:

DHC-APP>SET n=-1
 
DHC-APP>SET m=1
 
DHC-APP>SET x="ABCDEFGHIJK"
 
DHC-APP>WRITE !,$EXTRACT(x,*-1)
 
J
DHC-APP>WRITE !,$EXTRACT(x,*-m)
 
J
DHC-APP>WRITE !,$EXTRACT(x,*+n)
 
J
DHC-APP>WRITE !,$EXTRACT(x,*-1,*-1)
 
J

请注意,星号和整数变量之间需要减号或加号。

下面的示例显示当from值为“1”时,一参数格式等效于二参数格式。 $EXTRACT函数都返回“H”。

DHC-APP>SET x="HELLO"
 
DHC-APP>WRITE !,$EXTRACT(x)
 
H
DHC-APP>WRITE !,$EXTRACT(x,1)
 
H

下面的示例返回一个子字符串“THIS IS”,它由第一到第七个字符组成。

DHC-APP>SET x="THIS IS A TEST"
 
DHC-APP>WRITE $EXTRACT(x,1,7)
THIS IS

以下示例还返回子字符串“THIS IS”。当from变量的值小于1时,$EXTRACT将该值视为1。因此,以下示例返回由第一到第七个字符组成的子字符串。

DHC-APP>SET X="THIS IS A TEST"
 
DHC-APP>WRITE $EXTRACT(X,-1,7)
THIS IS

下面的示例返回字符串的最后四个字符:

DHC-APP>SET X="THIS IS A TEST"
 
DHC-APP>WRITE $EXTRACT(X,*-3,*)
TEST

以下示例还返回字符串的最后四个字符:

DHC-APP>SET X="THIS IS A TEST"
 
DHC-APP>WRITE $EXTRACT(X,*-3,14)
TEST

下面的示例从对象属性中提取一个子字符串:

DHC-APP>SET tStatement = ##class(%SQL.Statement).%New()
 
DHC-APP>SET tStatement.%SchemaPath="MyTests,Sample,Cinema"
 
DHC-APP> WRITE "whole schema path: ",tStatement.%SchemaPath,!
whole schema path: MyTests,Sample,Cinema
 
DHC-APP>WRITE "start of schema path: ",$EXTRACT(tStatement.%SchemaPath,1,10),!
start of schema path: MyTests,Sa

使用SET $EXTRACT替换子字符串

可以将$EXTRACTSET命令一起使用,以另一个值替换指定的字符或字符范围。也可以使用它在字符串末尾附加字符。

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

如果函数使用相对偏移量语法:*表示字符串末尾,而*-n*+n表示相对于字符串末尾的相对偏移量,则不能将set(a,b,c,...)=Value语法与等号左侧的$EXTRACT(或$PICEL或$LIST)一起使用。必须改用set a=value、b=value、c=value、...。语法。

SET $EXTRACT的最简单形式是一对一替换:

DHC-APP>SET alph="ABZD"
 
DHC-APP>SET $EXTRACT(alph,3)="C"
 
DHC-APP>WRITE alph
ABCD

通过将to指定为比字符串长度大1的正整数,或将to指定为*+1,可以将字符附加到字符串,如下例所示:

DHC-APP>SET alph="ABCD"
 
DHC-APP>SET $EXTRACT(alph,5)="E"
 
DHC-APP>WRITE alph        ; "ABCDE"
ABCDE
DHC-APP>SET alph="ABCD"
 
DHC-APP>SET $EXTRACT(alph,*+1)="E"
 
DHC-APP>WRITE alph        ; "ABCDE"
ABCDE

如果指定大于字符串加1的值,则$EXTRACT填充空格为空白:

DHC-APP>SET alph="ABCD"
 
DHC-APP>SET len=$LENGTH(alph)
 
DHC-APP>SET $EXTRACT(alph,len+2)="F"
 
DHC-APP>WRITE alph
ABCD F
DHC-APP>SET alph="ABCD"
 
DHC-APP>SET $EXTRACT(alph,*+2)="F"
 
DHC-APP>WRITE alph
ABCD F

还可以提取一个字符串,并将其替换为其他长度的字符串。例如,以下命令从foo中提取字符串“Rhode Island”,并将其替换为字符串“ Texas”,而无需填充。

DHC-APP>SET foo="Deep in the heart of Rhode Island"
 
DHC-APP>SET $EXTRACT(foo,22,33)="Texas"
 
DHC-APP>WRITE foo
Deep in the heart of Texas

可以提取字符串并将其设置为空字符串,然后从字符串中删除提取的字符:

DHC-APP>SET alph="ABCzzzzzD"
 
DHC-APP>SET $EXTRACT(alph,4,8)=""
 
DHC-APP>WRITE alph
ABCD

如果指定从大于到,则不会发生替换:

DHC-APP>SET alph="ABCD"
 
DHC-APP>SET $EXTRACT(alph,4,3)="X"
 
DHC-APP>WRITE alph
ABCD

在下面的示例中,假定变量x不存在。

DHC-APP>KILL x
 
DHC-APP>SET $EXTRACT(x,1,4)="ABCD"
 
DHC-APP>WRITE x
ABCD

SET命令创建变量x并为其分配值“ABCD”。

SET $EXTRACT将根据需要使用空格填充前导填充,但不执行尾部填充。下面的示例在字符串末尾的第六个位置插入值“F”,但在位置7和8处不插入其他字符:

DHC-APP>SET alph="ABCD"
 
DHC-APP>SET $EXTRACT(alph,6,8)="F"
 
DHC-APP>WRITE alph
ABCD F

下面的示例在第六个位置插入值“F”,并添加超出指定范围的字符:

DHC-APP>SET alph="ABCD"
 
DHC-APP>SET $EXTRACT(alph,6,8)="FGHIJ"
 
DHC-APP>WRITE alph
ABCD FGHIJ

下面的示例通过将from提取到大于替换字符串中的值数目的范围来缩短字符串。

DHC-APP>SET $EXTRACT(x,3,6)="Z"
 
DHC-APP>WRITE x
ABZGH

在第三个位置插入值“Z”,并删除位置4、5和6。变量x现在包含值“ABZGH”,长度为5。

注意

$EXTRACT和Unicode

$EXTRACT函数对字符而不是字节进行操作。因此,Unicode字符串的处理方式与ASCII字符串相同,如以下示例所示,将Unicode字符用作“pi”($ CHAR(960)):

/// d ##class(PHA.TEST.Function).EXTRACT()
ClassMethod EXTRACT()
{
    
    
	IF $SYSTEM.Version.IsUnicode()  {
    
    
		SET a="QT PIE"
		SET b="QT "_$CHAR(960)
		SET a1=$EXTRACT(a,-33,4)
		SET a2=$EXTRACT(a,4,4)
		SET a3=$EXTRACT(a,4,99)
		SET b1=$EXTRACT(b,-33,4)
		SET b2=$EXTRACT(b,4,4)
		SET b3=$EXTRACT(b,4,99)
		WRITE !,"ASCII form returns ",!,a1,!,a2,!,a3
		WRITE !,"Unicode form returns ",!,b1,!,b2,!,b3
	} ELSE {
    
    
		WRITE "This example requires a Unicode installation of Caché"
	}
}

ASCII form returns
QT P
P
PIE
Unicode form returns
QT π
π
π

代理对

$EXTRACT无法识别代理对。代理对用于表示某些中文字符并支持日语JIS2004标准。可以使用$WISWIDE函数确定字符串是否包含代理对。 $WEXTRACT函数可以识别并正确解析代理对。 $EXTRACT$EXTRACT相同。但是,由于$EXTRACT通常比$WEXTRACT快,因此对于不可能遇到代理对的所有情况,$EXTRACT是更可取的。

DTM模式下的$EXTRACT

在DTM和DTM-J模式下,$EXTRACT支持两个附加参数,如下所示:

$EXTRACT(string,from,to,replace,pad)

可选的replace参数用replace子字符串替换from和to指定的子字符串,并返回结果。原始字符串不变。

可选的pad参数指定填充字符。当from参数指定一个超出字符串末尾的位置时,将使用此选项。返回的字符串将填充到from所指定的位置,后跟replace子字符串。填充值可以是任何单个字符;非数字字符必须用引号引起来。要将引号字符指定为填充字符文字,请将其加倍。

可以使用%SYSTEM.Process类的LanguageMode()方法来设置DTM模式(2)或DTM-J模式(7)。

以下示例显示了四参数替换语法:

DHC-APP>SET x="ABCDEFGH"
 
DHC-APP>DO ##class(%SYSTEM.Process).LanguageMode(2)
 
DHC-APP>WRITE $EXTRACT(x,3,6,"##")
AB##GH

以下示例使用四参数语法附加替换字符串:

DHC-APP>SET x="ABCDEFGH"
 
DHC-APP> DO ##class(%SYSTEM.Process).LanguageMode(2)
 
DHC-APP>WRITE $EXTRACT(x,1,0,"##")
##ABCDEFGH

以下示例显示了五参数填充和替换语法:

DHC-APP>SET x="ABCDEFGH"
 
DHC-APP> DO ##class(%SYSTEM.Process).LanguageMode(2)
 
DHC-APP>WRITE $EXTRACT(x,12,16,"##","*")
ABCDEFGH***##

注意:使用四参数或五参数语法时,$EXTRACT from和to参数不支持星号语法。 SET $EXTRACT不能与四参数或五参数语法一起使用。

E X T R A C T 与 EXTRACT与 EXTRACTPIECE和$LIST的比较

$EXTRACT通过从字符串开头计数字符来确定子字符串。 $EXTRACT将任何普通字符串作为输入。 $PIECE$LIST都可用于特殊准备的字符串。

$PIECE通过计算字符串中用户定义的定界符来确定子字符串。

$LIST通过从列表的开头计数元素(而非字符)来确定编码列表中的元素。 $LIST不能用于普通字符串,而$EXTRACT不能用于编码列表。

猜你喜欢

转载自blog.csdn.net/yaoxin521123/article/details/108398117