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
广告