- LISP 教程
- LISP - 首页
- LISP - 概述
- LISP - 环境
- LISP - 程序结构
- LISP - 基本语法
- LISP - 数据类型
- LISP - 宏
- LISP - 变量
- LISP - 常量
- LISP - 运算符
- LISP - 决策
- LISP - 循环
- LISP - 函数
- LISP - 谓词
- LISP - 数字
- LISP - 字符
- LISP - 数组
- LISP - 字符串
- LISP - 序列
- LISP - 列表
- LISP - 符号
- LISP - 向量
- LISP - 集合
- LISP - 树
- LISP - 哈希表
- LISP - 输入与输出
- LISP - 文件 I/O
- LISP - 结构体
- LISP - 包
- LISP - 错误处理
- LISP - CLOS
- LISP 有用资源
- Lisp - 快速指南
- Lisp - 有用资源
- Lisp - 讨论
Lisp - 字符串
在 Common Lisp 中,字符串是向量,即字符的一维数组。
字符串字面量用双引号括起来。字符集中支持的任何字符都可以用双引号括起来构成字符串,除了双引号字符(")和转义字符(\)。但是,您可以使用反斜杠(\)对它们进行转义来包含它们。
示例
创建一个名为 main.lisp 的新源代码文件,并在其中键入以下代码。
main.lisp
; print statements (write-line "Hello World") (write-line "Welcome to Tutorials Point") ; escaping the double quote character (write-line "Welcome to \"Tutorials Point\"")
输出
执行代码时,它将返回以下结果:
Hello World Welcome to Tutorials Point Welcome to "Tutorials Point"
字符串比较函数
数值比较函数和运算符(如 < 和 >)不适用于字符串。Common LISP 提供了另外两组函数用于在代码中比较字符串。一组区分大小写,另一组不区分大小写。
下表提供了这些函数:
区分大小写函数 | 不区分大小写函数 | 描述 |
---|---|---|
string= | string-equal | 检查操作数的值是否都相等,如果相等则条件为真。 |
string/= | string-not-equal | 检查操作数的值是否都不相等,如果值不相等则条件为真。 |
string< | string-lessp | 检查操作数的值是否单调递减。 |
string> | string-greaterp | 检查操作数的值是否单调递增。 |
string<= | string-not-greaterp | 检查任何左侧操作数的值是否大于或等于下一个右侧操作数的值,如果是则条件为真。 |
string>= | string-not-lessp | 检查任何左侧操作数的值是否小于或等于其右侧操作数的值,如果是则条件为真。 |
示例
更新名为 main.lisp 的源代码文件,并在其中键入以下代码。
main.lisp
; case-sensitive comparison for equality (write (string= "this is test" "This is test")) ; terminate printing (terpri) ; case-sensitive comparison for greater than (write (string> "this is test" "This is test")) ; terminate printing (terpri) ; case-sensitive comparison for less than (write (string< "this is test" "This is test")) ; terminate printing (terpri) ;case-insensitive comparision for equality (write (string-equal "this is test" "This is test")) ; terminate printing (terpri) ;case-insensitive comparision for greater than (write (string-greaterp "this is test" "This is test")) ; terminate printing (terpri) ;case-insensitive comparision for less than (write (string-lessp "this is test" "This is test")) ; terminate printing (terpri) ; checking non-equality (write (string/= "this is test" "this is Test")) ; terminate printing (terpri) (write (string-not-equal "this is test" "This is test")) ; terminate printing (terpri) (write (string/= "lisp" "lisping")) ; terminate printing (terpri) (write (string/= "decent" "decency"))
输出
执行代码时,它将返回以下结果:
NIL 0 NIL T NIL NIL 8 NIL 4 5
大小写控制函数
下表描述了大小写控制函数:
序号 | 函数及描述 |
---|---|
1 | string-upcase 将字符串转换为大写 |
2 | string-downcase 将字符串转换为小写 |
3 | string-capitalize 将字符串中每个单词的首字母大写 |
示例
更新名为 main.lisp 的源代码文件,并在其中键入以下代码。
main.lisp
; convert to upper case and print statement (write-line (string-upcase "a big hello from tutorials point")) ; convert to Capital case and print statement (write-line (string-capitalize "a big hello from tutorials point"))
输出
执行代码时,它将返回以下结果:
A BIG HELLO FROM TUTORIALS POINT A Big Hello From Tutorials Point
修剪字符串
下表描述了字符串修剪函数:
序号 | 函数及描述 |
---|---|
1 | string-trim 它以字符字符串作为第一个参数,以字符串作为第二个参数,并返回一个子字符串,其中第一个参数中的所有字符都从参数字符串中删除。 |
2 | String-left-trim 它以字符字符串作为第一个参数,以字符串作为第二个参数,并返回一个子字符串,其中第一个参数中的所有字符都从参数字符串的开头删除。 |
3 | String-right-trim 它以字符字符串作为第一个参数,以字符串作为第二个参数,并返回一个子字符串,其中第一个参数中的所有字符都从参数字符串的末尾删除。 |
示例
更新名为 main.lisp 的源代码文件,并在其中键入以下代码。
main.lisp
; trim and print the statement (write-line (string-trim " " " a big hello from tutorials point ")) ; trim spaces on left and print the statement (write-line (string-left-trim " " " a big hello from tutorials point ")) ; trim spaces on right and print the statement (write-line (string-right-trim " " " a big hello from tutorials point ")) ; trim spaces on both left and right and print the statement (write-line (string-trim " a" " a big hello from tutorials point "))
输出
执行代码时,它将返回以下结果:
a big hello from tutorials point a big hello from tutorials point a big hello from tutorials point big hello from tutorials point
其他字符串函数
LISP 中的字符串是数组,因此也是序列。我们将在后续教程中介绍这些数据类型。所有适用于数组和序列的函数也适用于字符串。但是,我们将通过各种示例演示一些常用函数。
计算长度
length 函数计算字符串的长度。
提取子字符串
subseq 函数返回一个子字符串(因为字符串也是序列),从特定索引开始,一直持续到特定结束索引或字符串的末尾。
访问字符串中的字符
char 函数允许访问字符串的单个字符。
示例
更新名为 main.lisp 的源代码文件,并在其中键入以下代码。
main.lisp
; print length of the statement (write (length "Hello World")) ; terminate printing (terpri) ; print substring of statement starting from index 6 (write-line (subseq "Hello World" 6)) ; print char from string at index 6 (write (char "Hello World" 6))
输出
执行代码时,它将返回以下结果:
11 World #\W
字符串的排序和合并
sort 函数允许对字符串进行排序。它接受一个序列(向量或字符串)和一个双参数谓词,并返回该序列的排序版本。
merge 函数接受两个序列和一个谓词,并返回一个序列,该序列是根据谓词合并这两个序列产生的。
示例
更新名为 main.lisp 的源代码文件,并在其中键入以下代码。
main.lisp
;sorting the strings (write (sort (vector "Amal" "Akbar" "Anthony") #'string<)) ; terminate printing (terpri) ;merging the strings ; merge sequences and print (write (merge 'vector (vector "Rishi" "Zara" "Priyanka") (vector "Anju" "Anuj" "Avni") #'string<))
输出
执行代码时,它将返回以下结果:
#("Akbar" "Amal" "Anthony") #("Anju" "Anuj" "Avni" "Rishi" "Zara" "Priyanka")
反转字符串
reverse 函数反转字符串。
例如,更新名为 main.lisp 的源代码文件,并在其中键入以下代码。
main.lisp
; print reverse of the statement (write-line (reverse "Are we not drawn onward, we few, drawn onward to new era"))
输出
执行代码时,它将返回以下结果:
are wen ot drawno nward ,wef ew ,drawno nward ton ew erA
连接字符串
concatenate 函数连接两个字符串。这是一个通用序列函数,您必须将结果类型作为第一个参数提供。
例如,更新名为 main.lisp 的源代码文件,并在其中键入以下代码。
main.lisp
; concatenate and print statements (write-line (concatenate 'string "Are we not drawn onward, " "we few, drawn onward to new era"))
输出
执行代码时,它将返回以下结果:
Are we not drawn onward, we few, drawn onward to new era