第十四章 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爲* + n
,SET $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替換子字符串
可以將$EXTRACT
與SET
命令一起使用,以另一個值替換指定的字符或字符範圍。也可以使用它在字符串末尾附加字符。
當$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
不能與四參數或五參數語法一起使用。
PIECE和$LIST的比較
$EXTRACT
通過從字符串開頭計數字符來確定子字符串。 $EXTRACT
將任何普通字符串作爲輸入。 $PIECE
和$LIST都
可用於特殊準備的字符串。
$PIECE
通過計算字符串中用戶定義的定界符來確定子字符串。
$LIST
通過從列表的開頭計數元素(而非字符)來確定編碼列表中的元素。 $LIST
不能用於普通字符串,而$EXTRACT
不能用於編碼列表。