本章主要讲解AutoLisp中的字符串、字符处理函数。

一、常用字符串处理函数

函数名函数功能
acsii返回一个字符对应的ASCII码值。
chr整数对应的ASCII码值。
read返回字符串中的第一个表或第一个原子。
strcase转换字符串大小写。
strcat字符串连接函数,将多个字符串合并为一个字符串。
strlen返回字符串长度。
substr返回字符串中的一个子串。
wcmatch将模式字符串与某指定的字符串进行匹配比较。
atof将一个字符串转为浮点数。
atoi将一个字符串转为整数。
itoa将一个整数转换为字符串。
rtos将实数转换为字符串。
distof根据模式将字符串转换为实数值。
angtof根据模式将角度字符串转换为浮点型。
angtos角度转换为字符串值。

接下来将逐一介绍上述函数的用法:

1、ascii和chr函数

这两个函数比较简单,不做过多介绍,直接看代码:

(ascii "A")  	;; 返回"A"对应的ASCII码整数值65。
(chr 65) 		;; 返回65对应的ASCII码字符串"A"。

2、read函数

  • 参数
参数参数含义
string字符串。string 参数不能在表或字符串外包含空格。
  • 返回值

read 函数将其参数转换成相应的数据类型后返回。如果未指定参数,read 返回 nil。

如果字符串中包含由空格、换行符、制表符或括号等 LISP 分隔符分开的多个词,则只返回其中的第一个词。

  • 用法
(read "hello world")				;; HELLO
(read "12 3")						;; 12
(read "(a b c) (d)") 				;; (a b c)
(read "1.230")						;; 1.23

3、strcase函数

参数参数含义
string字符串。
flag如果提供该参数且其值不为 nil,string 中的所有字符将被转换成小写,否则将字符转换为大写。
  • 返回值

转换之后的字符串。

  • 用法
(strcase "HelloWorld")				;; "HELLOWORLD"
(strcase "HelloWorld" T)			;; "helloworld"

4、strcat和strlen函数

strcat:字符串连接函数,将多个字符串合并为一个字符串。
strlen:计算字符串长度。
这两个函数用法相对简单,直接通过代码展示效果:

(strcat "Hello" " " "World" "!")			;; "Hello World!"
(strlen "Hello World!")						;; 12

5、substr函数

参数参数含义
string字符串。
start整型,指定一个截取字符串的起始位置。
length整型,指定截取字符串的长度。
  • 返回值

截取的结果字符串。

  • 用法
(substr "HelloWorld" 1)				;; "HelloWorld",注意:截取字符串的函数字符串其实位置是1,而不是0
(substr "HelloWorld" 1 2)			;; "He"

6、wcmatch函数

参数参数含义
string要比较的字符串。比较是区分大小写的,所以必须严格匹配大小写字符。
pattern模式字符串,包含与 string 进行匹配的模式。pattern 可以包含表通配符中所列的通配符。在多个模式条件之间用逗号 (,) 分隔。函数仅比较 string 和 pattern 的前 500 个字符(约数),后面的字符将被省略。
  • 返回值

如果 string 和 pattern 匹配,wcmatch 返回 T,否则 wcmatch 返回 nil。

通配符定义
# (磅值符号)匹配任意单个数值字符
@ (at)匹配任意单个字母字符
. (句号)匹配任意单个非字母数值字符
* (星号)匹配任意字符序列,包括空字符串,它可以出现在任何位置,包括开头、中间和结尾处
? (问号)匹配任意单个字符
~ (波浪号)如果它是模式字符串的第一个字符,则匹配除此字符串之外的任意字符串
[…]匹配括号中的任意一个字符
[~…]匹配不在括号中的任意单个字符
– (连字符)用在括号里面,用来指明单个字符的取值范围
, (逗号)分隔两个模式字符串
` (单引号)特殊转义字符(按字义读取随后的字符)
  • 用法
(wcmatch "Hello" "H*") 			;; 返回T,判断字符串 "Hello" 是否以字符 H 开头
(wcmatch "Hello" "~*l*,H*") 	;; 返回T,判断字符串中是否没有字母l或者以H开头,满足二者之一即返回T,这里满足以H开头。

  • 如何在wcmatch中使用转义字符。

要测试一个字符串中的通配符,可以使用单个单引号 (`) 来转义字符。转义是指跟在单个单引号后面的字符不当作通配符读取,而是按其表面值进行比较。例如:

(wcmatch "Hello" "*`,*") 			;; 返回nil,判断在字符串Hello中是否包含逗号,这里需要注意,在转义"\"字符的时候需要使用"`\\"

此函数在实际使用中一般不会涉及到复杂的功能,了解如何使用即可。

7、字符串相关转换函数

转换函数相对来说比较简单,所以我们也直接通过代码来演示如何使用。

(atof "1.25")							;; 1.25
(atoi "1")								;; 1
(atoi "1.25")							;; 1
(atof "1")								;; 1.0
(itoa	1) 								;; "1"

8、distof和rtos函数

distof和rtos函数的参数中都会涉及到转换模式(mode)的指定,通过指定不同的mode来实现格式化不同格式的字符串或实数。

mode参数含义:

数值单位
1科学
2小数
3工程(英尺和小数英寸)
4建筑(英尺和分数英寸)
5分数
;; 函数:(rtos number [mode] [precision])
(rtos 2.5 1 4)		;; "2.5000E+00"
(rtos 2.5 2 4)		;; "2.5000"
(rtos 2.5 3 4)		;; "2.5000\""
(rtos 2.5 4 2)		;; "2 1/2\""
(rtos 2.5 5 2)		;; "2 1/2"

;; 函数:(distof string [mode])
(distof "2.5000E+00" 1)	;; 2.5
(distof "2.5000" 2)		;; 2.5
(distof "2.5000\"" 3)	;; 2.5
(distof "2 1/2\"" 4)	;; 2.5
(distof "2 1/2" 5)		;; 2.5

9、angtof和angtos函数

angtof:将表示角度的字符串转换为实数(浮点数)形式的弧度值。
angtos:将一个以弧度为单位的角度值转换成字符串。
angtof和angtos函数是一对互补函数。如果将angtos函数创建的一个字符串作为参数传给函数angtof,那么,angtof函数保证会返回一个有效值,反之亦然。

在这两个函数中,units的含义如下:

数值含义
0(十进制)度
1度/分/秒
2百分度
3弧度
4勘测单位
;; 函数:(angtos angle [mode] [precision])
(angtos 1.5708 0 2) 			;; "90.00"
(angtos 1.5708 1 2) 			;; "90d0'"
(angtos 1.5708 2 2) 			;; "100.00g"
(angtos 1.5708 3 2) 			;; "1.57r"
(angtos 1.5708 4 2) 			;; "N"

;; 函数:(angtof string [units])
(angtof "90.00" 0)				;; 1.5708 
(angtof "90d0'" 1)				;; 1.5708 
(angtof "100.00g" 2)			;; 1.5708 
(angtof "1.57r" 3)				;; 1.57
(angtof "N" 4)					;; 1.5708 
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐