字符串函数

  • 每个字符串函数的目标变量必须是字符串,并且 必须已声明为 (请参阅 STRING)。
  • 列表中的多个自变量必须以逗号分隔。
  • 比较两个字符串时,输入它们的情况很重要。 LOWERUPCASE 函数可用于对字符串进行比较,而不考虑大小写。
  • 包含字节位置或计数参数或返回字节位置或计数的字符串函数在 Unicode 方式下可能返回与代码页方式下不同的结果。 例如, é 在代码页方式下为 1 个字节,但在 Unicode 方式下为 2 个字节; 因此 r é s o m é 在代码页方式下为 6 个字节,在 Unicode 方式下为 8 个字节。
  • 在 Unicode 方式下,除非使用 NTRIM 函数显式保留,否则将始终从字符串函数中的字符串变量值中除去尾部空格。
  • 在代码页方式下,除非使用 RTRIM 函数显式除去,否则在字符串变量的值中始终保留尾部空格。

有关 Unicode 方式的更多信息,请参阅 UNICODE 子命令

CHAR.INDEX. CHAR.INDEX(haystack, needle[, divisor])。 数值。 返回指示 haystack 中第一次出现 needle 的字符位置的数字。 可选的第三个参数 divisor 是用于将 needle 划分为单独字符串的字符数。 每个子字符串用于进行搜索,函数返回第一个出现的任何子字符串。 例如,CHAR.INDEX(var1, 'abcd') 将返回字符串变量 var1 中完整的字符串“abcd”的起始位置的值;CHAR.INDEX(var1, 'abcd', 1) 将返回第一次出现字符串中任意值的位置的值;CHAR.INDEX(var1, 'abcd', 2) 将返回第一次出现“ab”或“cd”的位置的值。 Divisor 必须是正整数并且必须均匀分割 needle 长度。 如果 needle 未出现在 haystack 中,那么返回 0。

CHAR.LENGTH. CHAR.LENGTH(strexpr)。 数值。 返回 strexpr 的字符长度且任何尾部空格已删除。

CHAR.LPAD. CHAR.LPAD(strexpr1,length[,strexpr2]). 字符串。 使用尽可能多拟合 strexpr2 的完整副本作为填充字符串向左填充 strexpr1 以使其长度达到 length 所指定的值。 长度的值代表字符数且必须为正整数。 如果省略可选参数 strexpr2,那么会用空格填充值。

CHAR.MBLEN. CHAR.MBLEN(strexpr,pos)。 数值。 返回在 strexpr 的字符位置 pos 处的字符中的字节数。

CHAR.RINDEX. CHAR.RINDEX(haystack,needle[,divisor])。 数值。 返回一个整数,指示字符串 needle 最后一次出现在字符串 haystack 中的起始字符位置。 可选的第三个参数 divisor 是用于将 needle 划分为单独的字符串的字符数。 例如,CHAR.RINDEX(var1, 'abcd') 将返回整个字符串“abcd”在变量 var1 中最后一次出现的起始位置;CHAR.RINDEX(var1, 'abcd', 1) 将返回字符串中任意值最后一次出现的位置的值;CHAR.RINDEX(var1, 'abcd', 2) 将返回“ab”或“cd”最后一次出现的起始位置的值。 Divisor 必须是正整数并且必须均匀分割 needle 长度。 如果未找到 needle,那么返回值 0。

CHAR.RPAD. CHAR.RPAD(strexpr1,length[,strexpr2]). 字符串。 使用 strexpr2 向右填充 strexpr1,以将其延伸到 length 所给定的长度,该长度使用同填充字符串一样多的完整副本,这些副本将拟合 strexpr2。 长度的值代表字符数且必须为正整数。 可选的第三个参数 strexpr2 是一个加引号的字符串或一个解析为字符串的表达式。 如果省略 strepxr2,那么会用空格填充值。

CHAR.SUBSTR. CHAR.SUBSTR(strexpr,pos[,length])。 字符串。 返回 strexpr 中从字符位置 pos 开始的子字符串。 可选的第三个参数代表子字符串中的字符数。 如果省略可选的参数 length,那么返回从 strexpr 的 pos 字符位置开始一直到 strexpr 结尾的子字符串。 例如,CHAR.SUBSTR('abcd', 2) 返回“bcd”;CHAR.SUBSTR('abcd', 2, 2) 返回“bc”。 (注: 如果要使用等号左侧的函数来替换子串,请使用 SUBSTR 函数而不是 CHAR.SUBSTR 。)

CONCATCONCAT(strexpr,strexpr[,..]). 字符串。 返回由其全部参数连接而成的字符串,对其求出的值必须为字符串。 此函数需要两个或更多参数。 在代码页模式中,如果 strexpr 是字符串变量,并且您只需要实际字符串值,而不向右填充到已定义的变量宽度,那么请使用 RTRIM。 例如,CONCAT(RTRIM(stringvar1) 和 RTRIM(stringvar2))。

LENGTHLENGTH(strexpr)。 数值。 返回 strexpr 的字节长度,strexpr 必须是一个字符串表达式。 对于字符串变量, 在 Unicode 模式中,这是每个值的字节数,不包括尾部空格,但在代码页模式中,这是定义的变量长度,包括尾部空格。 若要获取代码页模式中不带尾部空格时的长度(字节),请使用 LENGTH(RTRIM(strexpr))。

LOWERLOWER(strexpr)。 字符串。 返回 strexpr,同时大写字母都更改为小写字母而其他字符不变。 该参数可以是一个字符串变量或一个值。 例如,如果 name1 的值为 Charles,则 LOWER(name1) 返回 charles。

LTRIMLTRIM(strexpr[,char])。 字符串。 返回包含移去的 char 的任何前导实例的 strexpr。 如果不指定 char,那么会移去前导空格。 Char 必须解析为单个字符。

MAXMAX(value,value[,..]). 数字或字符串。 返回其具有有效值的参数的最大值。 此函数需要两个或更多参数。 对于数值,您可以指定有效参数的最小数目,以对此函数求值。

MINMIN(value,value[,..]). 数字或字符串。 返回其具有有效非缺失值的参数的最小值。 此函数需要两个或更多参数。 对于数值,您可以指定有效参数的最小数目,以对此函数求值。

MBLEN.BYTE. MBLEN.BYTE(strexpr,pos)。 数值。 返回在 strexpr 的字节位置 pos 处的字符中的字节数。

NORMALIZENORMALIZE(strexp)。 字符串。 返回 strexp 标准化版本。 Unicode 模式下,返回 Unicode NFC。 代码页模式下,无效应并返回未修改的 strexp。 结果长度可能与输入长度不同。

NTRIMNTRIM(varname)。 返回 varname 值,不用删除尾部空格。 varname 的值必须是一个变量名,不可以是一个表达式。

REPLACEREPLACE(a1, a2, a3[, a4])。 字符串。 在 a1 中,a2 的实例替换为 a3。 可选参数 a4 指定要替换的实例数;如果省略 a4,那么替换所有实例。 参数 a1、a2 和 a3 必须解析为字符串值(用引号括起的文本字符串或字符串变量),可选参数 a4 必须解析为非负整数。 例如,REPLACE("abcabc", "a", "x") 返回值“xbcxbc”;REPLACE("abcabc", "a", "x", 1) 返回值“xbcabc”。

RTRIMRTRIM(strexpr[,char])。 字符串。 删除 strexpr 中 char 的尾部实例。 可选的第二个参数 char 是包含在一对单引号中的单个字符,或是某个产生单个字符的表达式。 如果忽略 char,那么会去除尾随空白。

STRUNCSTRUNC(strexp, length)。 字符串。 返回截断至长度(以字节为单位)的 strexp 然后删除所有尾部空格。 截断将删除任何可能被截断的字符片段。

UPCASEUPCASE(strexpr)。 字符串。 在返回的值中将 strexpr 的小写字母变成了大写字母,而其他字符保持不变。

不推荐使用的字符串函数

以下函数提供类似于较新的 CHAR 函数的功能,但它们在字节级别而不是字符级别运行。 例如, INDEX 函数返回 haystackneedle 的字节位置,而 CHAR.INDEX 返回字符位置。 支持这些功能主要是为了与先前发行版兼容。

INDEXINDEX(haystack,needle[,divisor])。 数值。 返回指示 haystack 中第一次出现 needle 的字节位置的数字。 可选的第三个参数 divisor 是用于将 needle 划分为单独字符串的字节数。 每个子字符串用于进行搜索,函数返回第一个出现的任何子字符串。 Divisor 必须是正整数并且必须均匀分割 needle 长度。 如果 needle 未出现在 haystack 中,那么返回 0。

LPADLPAD(strexpr1,length[,strexpr2])。 字符串。 使用尽可能多拟合 strexpr2 的完整副本作为填充字符串向左填充 strexpr1 以使其长度达到 length 所指定的值。 长度的值表示字节数且必须为正整数。 如果省略可选参数 strexpr2,那么会用空格填充值。

RINDEXRINDEX(haystack,needle[,divisor])。 数值。 返回一个整数,指示字符串 needle 最后一次出现在字符串 haystack 中的起始字节位置。 可选的第三个参数 divisor 是用于将 needle 划分为单独的字符串的字节数。 Divisor 必须是正整数并且必须均匀分割 needle 长度。 如果未找到 needle,那么返回值 0。

RPADRPAD(strexpr1,length[,strexpr2])。 字符串。 使用 strexpr2 向右填充 strexpr1,以将其延伸到 length 所给定的长度,该长度使用同填充字符串一样多的完整副本,这些副本将拟合 strexpr2。 长度的值表示字节数且必须为正整数。 可选的第三个参数 strexpr2 是一个加引号的字符串或一个解析为字符串的表达式。 如果省略 strepxr2,那么会用空格填充值。

SUBSTRSUBSTR(strexpr,pos[,length])。 字符串。 返回从 strexpr 字节位置 pos 开始的子字符串。 可选第三参数代表子字符串中的字节数。 如果省略可选参数长度,则返回从 strexpr 的字节位置 pos 处开始且运行至 strexpr 末尾的字符串。 在等号左侧使用时,会将子串替换为等号右侧指定的字符串。 原始字符串的其余部分保持不变。 例如, SUBSTR(ALPHA6,3,1)='*'ALPHA6 的所有值的第三个字符更改为 *。 如果替换字符串比子串长或短,那么将截断替换字符串或在右边填充空白,使其长度相等。

示例

STRING stringVar1 stringVar2 stringVar3 (A22).
COMPUTE stringVar1='  Does this'.
COMPUTE stringVar2='ting work?'.
COMPUTE stringVar3=
  CONCAT(RTRIM(LTRIM(stringVar1)), " ", 
  REPLACE(stringVar2, "ting", "thing")).
  • CONCAT 函数并置 stringVar1stringVar2的值,在它们之间插入一个空格作为文字串 (" ")。
  • RTRIM 函数会删除 stringVar1中的尾部空格。 在代码页方式下,这对于消除两个并置的字符串值之间的过多空间是必需的,因为在代码页方式下,所有字符串变量值都会自动向右填充到定义的字符串变量宽度。 在 Unicode 方式下,这不起作用,因为在 Unicode 方式下会自动从字符串变量值中除去尾部空格。
  • LTRIM 函数从 stringVar1的值开始处除去前导空格。
  • REPLACE 函数在 stringVar2中将拼写错误的 "ting" 替换为 "thing"

最终结果是字符串值 "this thing work?"

示例

此示例将字符串电话号码中的数字组件抽取到三个数字变量中。

DATA LIST FREE (",") /telephone (A16).
BEGIN DATA
111-222-3333
222 - 333 - 4444
333-444-5555
444 - 555-6666
555-666-0707
END DATA.
STRING #telstr(A16).
COMPUTE #telstr = telephone.
VECTOR tel(3,f4).
LOOP #i = 1 to 2.
- COMPUTE #dash = CHAR.INDEX(#telstr,"-").
- COMPUTE tel(#i) = NUMBER(CHAR.SUBSTR(#telstr,1,#dash-1),f10).
- COMPUTE #telstr = CHAR.SUBSTR(#telstr,#dash+1).
END LOOP.
COMPUTE tel(3) = NUMBER(#telstr,f10).
EXECUTE.
FORMATS tel1 tel2 (N3) tel3 (N4).
  • 将声明临时 (临时) 字符串变量 #telstr,并将其设置为原始字符串电话号码的值。
  • VECTOR 命令创建三个数字变量 --tel1 , tel2,tel3-- 并创建包含这些变量的向量。
  • LOOP 结构迭代两次以生成 tel1tel2的值。
  • COMPUTE #dash = CHAR.INDEX(#telstr,"-") 将创建另一个临时变量 #dash,其中包含字符串值中第一个短划线的位置。
  • 在第一次迭代中, COMPUTE tel(#i) = NUMBER(CHAR.SUBSTR(#telstr,1,#dash-1),f10) 会抽取第一个短划线之前的所有内容,将其转换为数字,并将 tel1 设置为该值。
  • COMPUTE #telstr = CHAR.SUBSTR(#telstr,#dash+1) 然后将 #telstr 设置为第一个短划线后的字符串值的剩余部分。
  • 在第二次迭代中, COMPUTE #dash...#dash 设置为 #telstr的修改值中 "第一个" 短划线的位置。 由于已从 #telstr中除去区域代码和原始的第一个短划线,因此这是短划线在交换与数字之间的位置。
  • COMPUTE tel(#)...tel2 设置为修改后的 #telstr版本中的 "第一个" 短划线之前的所有内容的数字值,即第一个短划线之后的所有内容以及原始字符串值中的第二个短划线之前的所有内容。
  • COMPUTE #telstr... 然后将 #telstr 设置为字符串值的剩余段-修改后的值中 "第一个" 短划线之后的所有内容,即原始值中第二个短划线之后的所有内容。
  • 完成两个循环迭代后, COMPUTE tel(3) = NUMBER(#telstr,f10) 会将 tel3 设置为原始字符串值的最终段的数字值。