第十四章 Caché 函數大全 $EXTRACT 函數 第十四章 Caché 函數大全 $EXTRACT 函數 大綱 描述 參數 使用SET $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不能與四參數或五參數語法一起使用。

EXTRACT與PIECE和$LIST的比較

$EXTRACT通過從字符串開頭計數字符來確定子字符串。 $EXTRACT將任何普通字符串作爲輸入。 $PIECE$LIST都可用於特殊準備的字符串。

$PIECE通過計算字符串中用戶定義的定界符來確定子字符串。

$LIST通過從列表的開頭計數元素(而非字符)來確定編碼列表中的元素。 $LIST不能用於普通字符串,而$EXTRACT不能用於編碼列表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章