4.3 创建字符串

下面这些函数用于创建字符串:可以从零新建、拼接字符串,或是拆分字符串。(有关基于其他字符串修改内容来创建新字符串的函数,如 string-replacereplace-regexp-in-string,请参见 “Search and Replace”。)

Function: make-string count character &optional multibyte

本函数返回一个由 character 重复 count 次构成的字符串。如果 count 为负数,会抛出错误。

(make-string 5 ?x)
     ⇒ "xxxxx"
(make-string 0 ?x)
     ⇒ ""

通常情况下,如果 characterASCII 字符,结果为单字节字符串。但如果可选参数 multibyte 非 nil,函数会生成多字节字符串。这在后续需要与非-ASCII 字符串拼接,或将部分字符替换为非-ASCII 字符时很有用。

可与此函数对比的其他函数包括 make-vector(see 向量)和 make-list(see 构建 cons 单元与列表)。

Function: string &rest characters

返回由给定字符 characters 组成的字符串。

(string ?a ?b ?c)
     ⇒ "abc"
Function: substring string &optional start end

该函数返回一个新字符串,由原字符串 string 中从索引 start(包含)到 end(不包含)之间的字符组成。第一个字符的索引是 0。只传一个参数时,该函数会直接复制整个 string

(substring "abcdefg" 0 3)
     ⇒ "abc"

上例中,‘a’ 的索引是 0,‘b’ 是 1,‘c’ 是 2。索引 3(字符串中第四个字符)标记截取的结束位置。因此从 "abcdefg" 中复制出 ‘abc’。

负数表示从字符串末尾算起,−1 代表最后一个字符的索引。例如:

(substring "abcdefg" -3 -1)
     ⇒ "ef"

本例中 ‘e’ 的索引是 −3,‘f’ 是 −2,‘g’ 是 −1。因此包含 ‘e’ 和 ‘f’,不包含 ‘g’。

如果 endnil,则代表字符串长度。因此:

(substring "abcdefg" -3 nil)
     ⇒ "efg"

省略参数 end 等价于传入 nil。由此可知 (substring string 0) 会返回整个 string 的副本。

(substring "abcdefg" 0)
     ⇒ "abcdefg"

但我们推荐使用 copy-sequence 来完成此操作(see 序列)。

如果从原 string 复制的字符带有文本属性,这些属性也会被复制到新字符串中。See Text Properties

substring 也接受将向量作为第一个参数。例如:

(substring [a b (c) "d"] 1 3)
     ⇒ [b (c)]

如果 start 不是整数,或 end 既不是整数也不是 nil,会抛出 wrong-type-argument 错误。如果 start 位置在 end 之后,或任一索引超出字符串范围,会抛出 args-out-of-range 错误。

将此函数与 buffer-substring(see Examining Buffer Contents)对比:后者返回当前缓冲区中一段文本构成的字符串。字符串的起始索引是 0,而缓冲区的起始索引是 1。

Function: substring-no-properties string &optional start end

功能与 substring 相同,但会丢弃结果中的所有文本属性。此外,start 可以省略或为 nil,等价于 0。因此 (substring-no-properties string) 会返回移除了所有文本属性的 string 副本。

Function: concat &rest sequences

该函数返回一个字符串,由所有参数中的字符(及其文本属性,如果有)组成。参数可以是字符串、数字列表或数字向量;参数本身不会被修改。如果 concat 没有参数,则返回空字符串。

(concat "abc" "-def")
     ⇒ "abc-def"
(concat "abc" (list 120 121) [122])
     ⇒ "abcxyz"
;; nil is an empty sequence.
(concat "abc" nil "-def")
     ⇒ "abc-def"
(concat "The " "quick brown " "fox.")
     ⇒ "The quick brown fox."
(concat)
     ⇒ ""

该函数不保证总会分配新字符串。调用者不应依赖结果是新字符串,或与某个已有字符串是 eq 关系。

特别注意:修改返回值可能会意外改变另一个字符串、修改程序中的常量字符串,甚至直接报错。若要得到可以安全修改的字符串,请对结果使用 copy-sequence

有关其他拼接函数,可参见 “映射函数” 中的 mapconcat、“向量相关函数” 中的 vconcat,以及 “构建 cons 单元与列表” 中的 append。若要将多个命令行参数拼接成可作为 Shell 命令的字符串,见 combine-and-quote-strings

Function: split-string string &optional separators omit-nulls trim

该函数根据正则表达式 separators(see Regular Expressions)将 string 切分为子串。每一次 separators 的匹配位置都是分割点;分割点之间的子串构成列表返回。

如果 separatorsnil(或省略),则使用默认值 split-string-default-separators,且函数行为相当于 omit-nullst

如果 omit-nulls 为 nil(或省略),当存在连续的 separators 匹配,或分隔符匹配出现在 string 开头 / 结尾时,结果中会包含空字符串。若 omit-nullst,这些空串会被忽略。

如果可选参数 trim 非-nil,它应为一个正则表达式,用于去掉每个子串开头和结尾的匹配内容。如果修剪后子串为空,则视为空串。

若你需要将字符串拆分为适合 call-processstart-process 使用的命令行参数列表,见 split-string-and-unquote

Examples:

(split-string "  two words ")
     ⇒ ("two" "words")

结果不是 ("" "two" "words" ""),这种情况通常没什么用。如果需要这样的结果,可以显式指定 separators

(split-string "  two words "
              split-string-default-separators)
     ⇒ ("" "two" "words" "")
(split-string "Soup is good food" "o")
     ⇒ ("S" "up is g" "" "d f" "" "d")
(split-string "Soup is good food" "o" t)
     ⇒ ("S" "up is g" "d f" "d")
(split-string "Soup is good food" "o+")
     ⇒ ("S" "up is g" "d f" "d")

空匹配是有效的,除非 split-string 已经通过非空匹配到达字符串末尾,或 string 本身为空,此时不会再寻找末尾的空匹配:

(split-string "aooob" "o*")
     ⇒ ("" "a" "" "b" "")
(split-string "ooaboo" "o*")
     ⇒ ("" "" "a" "b" "")
(split-string "" "")
     ⇒ ("")

不过,当 separators 可以匹配空串时,omit-nulls 通常设为 t,因此上面几个例子中的细节很少实际用到:

(split-string "Soup is good food" "o*" t)
     ⇒ ("S" "u" "p" " " "i" "s" " " "g" "d" " " "f" "d")
(split-string "Nice doggy!" "" t)
     ⇒ ("N" "i" "c" "e" " " "d" "o" "g" "g" "y" "!")
(split-string "" "" t)
     ⇒ nil

某些 “non-greedy非贪婪” 的 separators 可能优先选择空匹配而非非空匹配,会出现有些奇怪但可预期的行为。这类值在实际中同样很少出现:

(split-string "ooo" "o*" t)
     ⇒ nil
(split-string "ooo" "\\|o+" t)
     ⇒ ("o" "o" "o")
Variable: split-string-default-separators

split-stringseparators 的默认值。 通常取值为 "[ \f\t\n\r\v]+"

Function: string-clean-whitespace string

清理 string 中的空白:将连续空白压缩为单个空格,并去掉 string 首尾所有空白。

Function: string-trim-left string &optional regexp

删除 string 开头匹配 regexp 的内容。 regexp 默认为 ‘[ \t\n\r]+’。

Function: string-trim-right string &optional regexp

删除 string 结尾匹配 regexp 的内容。 regexp 默认为 ‘[ \t\n\r]+’。

Function: string-trim string &optional trim-left trim-right

同时删除 string 开头匹配 trim-left 与结尾匹配 trim-right 的内容。两个正则表达式默认均为 ‘[ \t\n\r]+’。

Function: string-fill string width

尝试对 string 自动换行,使每行显示宽度不超过 width。仅在空白处换行。如果存在单个单词长度超过 width,不会截断单词,因此最终 string 显示行可能会比 width 宽。

Function: string-limit string length &optional end coding-system

如果 string 字符数小于 length,直接返回原串。否则返回由前 length 个字符组成的子串。如果提供了可选参数 end,则返回最后 length 个字符组成的字符串。

如果 coding-system 非-nil,会先对 string 编码,再按字节限制长度,结果为不超过 length 字节的单字节字符串。如果 string 包含多字节编码字符(如 utf-8),结果字符串绝不会在字符编码中间被截断。

该函数按字符数或字节数计算长度,因此通常不适合用于显示场景的字符串缩短;此时应使用 truncate-string-to-widthwindow-text-pixel-sizestring-glyph-split(see Size of Displayed Text)。

Function: string-lines string &optional omit-nulls keep-newlines

按换行符边界将 string 拆分为字符串列表。如果可选参数 omit-nulls 非-nil,结果中去掉空行。如果 keep-newlines 非-nil,则保留结果字符串末尾的换行符。

Function: string-pad string length &optional padding start

使用 padding 作为填充字符,将 string 填充到长度 lengthpadding 默认为空格。如果 string 本身比 length 长,则不填充。如果 startnil 或省略,填充在 string 尾部;若非-nil,则填充在头部。

Function: string-chop-newline string

移除 string 末尾可能存在的最后一个换行符。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike