IDL中可以用单引号‘’或双引号""来创建字符转
- >>a = 'hlz'
- >>b = "hlz"
- >>a eq b
- 1
创建字符串数组,可以利用中括号[]和逗号,相组合的方式进行创建
- >>a = ['Hlz','XMU','厦门']
- >>a
- Hlz
- XMU
- 厦门
- >>help,a
- A STRING = Array[3]
- >>a[1] ; 字符串数组是可以被索引,只能索引整个元素,无法索引某个元素组成
- XMU
注:字符串是无法索引的,字符串数组可以,可以用字符串提取(截取)函数Strmid()实现,这个往往会用到字符转长度查看函数Strlen()、子字符串搜索函数Strpos()、去除字符串首尾空格函数Strtrim()。
语法:Result = STRMID(Expression, First_Character [, Length] , /REVERSE_OFFSET )
语法:Result = STRLEN(Expression)
语法:Result = STRPOS( Expression, Search_String [, Pos], /REVERSE_OFFSET, /REVERSE_SEARCH )
语法:Result = STRTRIM( String [, Flag] )
- >>a = 'hlz-xiamenuniversuty'
- >>a[2]
- % Attempt to subscript A with
- 2)> is out of range.
- % Execution halted at: $MAIN$
- >>a = 'hlz-xiamenuniversuty' ; 包含前后空格的字符串a
- >>print,Strlen(a) ; 查看字符串a的长度
- 22
- >>a = Strtrim(a,2) ; 移除两端空格,0:移除右端所有空格;1:移除左端所有空格;2:移除左右两端所有空格
- >>print,Strlen(a)
- 20
- >>; 提取字符串中xiamen子字符串
- >>index1 = Strpos(a,'xiamen') ; 字符串'xiamen'在字符串a的的位置,返回子字符串的起始位置,若不存在则返回-1
- >>index1
- 4
- >>leng_str = Strlen('xiamen') ; 字符串'xiamen'的长度
- >>leng_str
- 6
- >>b = Strmid(a,index1,leng_str) ; 提取字符串a中的子字符串
- >>b
- xiamen
创建空字符串,可以利用StrArr()函数,进行创建;
语法:Result = STRARR(D1[, ..., D8])
- >>S = STRARR(4,3) ; 创建4列3行的空的字符串数组
- >>help,S
- S STRING = Array[4, 3]
- >>S[1,1] ; 查看元素值
-
- >>help,S[1,1] ; 查看元素值
STRING = ''
2. 字符串操作
2.1 字符串的信息
IDL中无法用length对象方法查看字符串的长度,可以利用字符转长度查看函数Strlen()查看
- >>a = 'hlz-xiamenuniversuty'
- >>a.LENGTH
- 1
- >>a.DIM
- 0
- >>print,Strlen(a)
- 20
当用函数Strlen()查看字符串数组时,会实现每个字符串元素的长度。
- >>Files
- e:\Test\1.tff
- e:\Test\2.jpg
- >>print,Strlen(files)
- 13 13
- >>help,Strlen(files)
LONG = Array[2]
此外,字符串数组中元素的个数可以用length方法、函数N_elements()获取。
- >>Files
- e:\Test\1.tff
- e:\Test\2.jpg
- >>print,files.LENGTH
- 2
- >>print,N_elements(files)
- 2
2.2 字符串连接
IDL中字符串连接和python一样,可以直接相加
- >>a = 'hlz'
- >>b = 'xmu'
- >>c = a+'\'+b+'.jpg'
- >>c
- hlz\xmu.jpg
字符串数组元素之间相连接,可以使用jion方法进行连接
- >>a = ['Hlz','jiangxiprovince','jingdezhenCity']
- >>b = a.Join('\') ; 将a中所有元素用\相连接
- >>b
- Hlz\jiangxiprovince\jingdezhenCity
注:当将字符串连接起来,组成一个文件路径是,最好用Path_sep()函数,该函数可以获取当前系统的分隔符,linux和win不同,分隔符是不一样的;win的分隔符为‘\’;linux的分隔符为‘/’。
2.3 字符串转换
字符串大小写转化函数
Strlowcase():将大写字符转化为小写字符
Strupcase():将小写字符转化为大写字符
语法:Result = STRLOWCASE(String)
语法:Result = STRUPCASE(String)
- >>a = 'Hulz_Jiangxi_OK'
- >>print,Strlowcase(a)
- hulz_jiangxi_ok
- >>print,Strupcase(a)
- HULZ_JIANGXI_OK
首字母大写:那么问题来了,如何将首字母转化为大写,其余字母小写。
首先,将字母转化为小写,提取除首字母以外的字符,提取第一个字母并转化为大写,最后合并。用到了Strlowcase()、Strupcase()、Strmid()函数。
- >>a = 'Hulz_Jiangxi_OK'
- >>print,Strlowcase(a) ; 第一步:转化为小写
- hulz_jiangxi_ok
- >>print,Strmid(Strlowcase(a),1); 第二步:提取字符串(小写部分)
- ulz_jiangxi_ok
- >>print,Strupcase(Strmid(Strlowcase(a),0,1)); 第二步:提取字符串(大写部分)
- H
- >>print,Strupcase(Strmid(Strlowcase(a),0,1))+Strmid(Strlowcase(a),1);第三步:合并
- Hulz_jiangxi_ok
此外,字符串可以直接转化为字节型Byte数据,即将字母转化为对应的数字,反之亦然。
- >>a = 'hlz'
- >>b = Byte(a)
- >>b
- 104 108 122
- >>help,b
- B BYTE = Array[3]
- >>c = long(a)
- % Type conversion error: Unable to convert
- given STRING to Long.
- % Detected at: $MAIN$
- >>d = long(Byte(a))
- >>d
- 104 108 122
2.4 字符提取
可以用函数Strmid()实现,具体介绍见本博客第1节
2.5 常见的字符串函数
2.5.1 获取文件名
可以用File_basename()函数,根据字符串获取文件名
语法:Result = File_basename(Path [, RemoveSuffix] [, /FOLD_CASE])
- >>fn = File_basename('e:\Test\sentinel1.tiff')
- >>fn
- sentinel1.tiff
2.5.2 获取文件路径
可以用File_dirname()函数,根据字符串获取文件路径
语法:Result = FILE_DIRNAME(Path [, /MARK_DIRECTORY])
- >>dn = File_dirname('e:\Test\sentinel1.tiff')
- >>dn
- e:\Test
2.5.3 获取编译文件的完整路径
可以用Routine_filepath()函数,根据编译的文件名,获取该文件的完整路径(字符串)。
注:需先编译文件,才能使用。
语法:Result = ROUTINE_FILEPATH( [Routine] [, /EITHER] [, /IS_FUNCTION] )
返回的是一个包含两个元素的结构体,Result .Name表示文件名,Result.path表示文件路径。
- >> .compile -v 'D:\Code\IDL\IDL_GUI\源码\chapter05\test_readF.pro'
- % Compiled module: TEST_READF.
- >> ROUTINE_FILEPATH('TEST_READF')
- D:\Code\IDL\IDL_GUI\源码\chapter05\test_readF.pro
注:在可以利用File_dirname()函数和File_basename()函数,获取文件路径和文件名。
2.5.4 字符串比较
字符串比较函数Strcmp(),可以比较两个字符串时候一样,
语法:Result = STRCMP( String1, String2 [, N], /FOLD_CASE )
参数N表示只比较前N个字符,关键字FOLD_CASE表示区分大小写
- >>a = 'Hlz'
- >>b ='hlz'
- >>c = 'Hlz-fox'
- >>print,Strcmp(a,b,/Fold_case) ; 是否区分大小写,默认不区分
- 1
- >>print,Strcmp(a,b,Fold_case=0) ; 区分大小写
- 0
- >>print,Strcmp(a,c) ; 不加参数N
- 0
- >>print,Strcmp(a,c,2) ; 只比较前2个字符
- 1
2.5.5 总结
以下是字符串处理历程(来源:官方文档)
FILE_BASENAME - 返回文件路径的基本名称。
FILE_DIRNAME - 返回文件路径的目录名。
I18N_MULTIBYTETOUTF8 - 将多字节转换为 UTF8。
I18N_MULTIBYTETOWIDECHAR - 将多字节转换为 UTF-16、宽字符 (Unicode)。
I18N_UTF8TOMULTIBYTE - 将 UTF-8 转换为多字节。
I18N_WIDECHARTOMULTIBYTE - 将 UTF-16、宽字符 (Unicode) 转换为多字节。
IDL_BASE64 - 在字节数组和 MIME Base64 编码的标量字符串之间转换。
READS - 从字符串变量执行格式化的输入/输出。
STRCMP - 比较两个字符串。
STRCOMPRESS - 从字符串中删除空格。
STREGEX - 执行正则表达式匹配。
STRING - 将参数转换为字符串类型。
STRJOIN - 将字符串标量或数组折叠成合并的字符串。
STRLEN - 返回字符串的长度。
STRLOWCASE - 将字符串转换为小写。
STRMATCH - 将搜索字符串与输入字符串表达式进行比较。
STRMID - 从字符串中提取子字符串。
STRPOS - 在字符串中查找第一次出现的子字符串。
STRPUT - 将一个字符串的内容插入另一个字符串。
STRSPLIT - 根据指定的模式将其输入字符串参数拆分为单独的子字符串。
STRTRIM - 从字符串中删除前导和/或尾随空格。
STRUPCASE - 将字符串转换为大写。
3. 特殊字符
3.1 包含引号的字符转
字符串中包含引号,则最后用另一种引号创建。
例如:打印:I'm Hlz, 打印:你真"棒"!
- >>print,"I'm Hlz"
- I'm Hlz
- >>print,'I'm Hlz'
-
- print,'I'm Hlz'
- ^
- % Syntax error.
- 你真"棒"!
- >>print,"你真"棒"! "
-
- print,"你真"棒"! "
- ^
- % Syntax error.
-
- print,"你真"棒"! "
- ^
- % Illegal character in program text.
如果字符串中既有单引号、又有双引号的字符串该如何处理?可以分开输入,在合并!
- >>print,"I'm Hlz"+'你真"棒"!'
- I'm Hlz你真"棒"!
3.2 特殊字符
略……(下次补充)
注:后续将针对字符串,整理相关的函数
不足之处,敬请斧正!
路漫漫其修远兮,吾将上下而求索