IDL学习:语法基础-字符串

1. 创建字符串

        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  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 特殊字符

        略……(下次补充)        

注:后续将针对字符串,整理相关的函数

不足之处,敬请斧正!

路漫漫其修远兮,吾将上下而求索

你可能感兴趣的:(IDL,学习,IDL)