4.5 字符与字符串的比较

Function: char-equal character1 character2

如果参数表示同一个字符,返回 t,否则返回 nil。如果 case-fold-search 非-nil,此函数会忽略大小写差异。

(char-equal ?x ?x)
     ⇒ t
(let ((case-fold-search nil))
  (char-equal ?x ?X))
     ⇒ nil
Function: string-equal string1 string2

如果两个字符串的字符完全匹配,返回 t。参数也可以是符号,此时会使用符号名进行比较。比较始终区分大小写,与 case-fold-search 无关。

比较两个字符串时,该函数等价于 equal(see 相等性谓词)。特别地,它会忽略字符串的文本属性;如果需要区分仅属性不同的字符串,使用 equal-including-properties。但与 equal 不同,只要任一参数不是字符串或符号,string-equal 就会报错。

(string-equal "abc" "abc")
     ⇒ t
(string-equal "abc" "ABC")
     ⇒ nil
(string-equal "ab" "ABC")
     ⇒ nil

当且仅当单字节字符串与多字节字符串包含的所有字符编码都在 0–127(ASCII)范围内时,string-equal 会认为它们相等。See Text Representations

Function: string= string1 string2

string=string-equal 的别名。

Function: string-equal-ignore-case string1 string2

string-equal-ignore-case 比较字符串时忽略大小写,类似于 case-fold-searcht 时的 char-equal

Function: string-collate-equalp string1 string2 &optional locale ignore-case

该函数会根据指定 locale区域 的排序规则比较两个字符串,若二者相等则返回 t;若未指定区域,默认使用当前系统的区域设置。排序规则的判定不仅基于字符串 string1string2 中字符的字典序,还包含字符间关联关系的额外规则。这类规则通常由 Emacs 运行时的区域环境,以及编译 Emacs 时链接的标准 C 库共同定义4

例如,部分编码点不同但语义相同的字符(如不同的重音符 Unicode 字符),在某些区域设置下会被判定为相等:

(string-collate-equalp (string ?\uFF40) (string ?\u1FEF))
     ⇒ t

可选参数 locale(字符串类型)会覆盖当前用于排序的区域设置标识符。该参数的值依赖于操作系统:POSIX 系统可使用 locale 设置值 "en_US.UTF-8",而在 MS-Windows 系统上则需使用例如 "enu_USA.1252" 这样的值。

ignore-case 参数非-nil,字符会先转换为小写形式,再进行大小写不敏感的比较。但如果底层系统库未提供特定区域的排序规则,此函数会降级使用 string-equal 进行比较 —— 这种情况下 ignore-case 参数会被忽略,比较始终是大小写敏感的。

要在 MS-Windows 系统上模拟符合 Unicode 标准的排序规则,需将 w32-collate-ignore-punctuation 绑定为非-nil,因为 MS-Windows 系统的区域设置中,字符集部分无法设置为 "UTF-8"

如果系统不支持区域设置环境,此函数的行为将等同于 string-equal

请勿使用此函数比较文件名是否相等,因为文件系统通常不遵循排序功能所实现的字符串语言等效规则。

Function: string-lessp string1 string2

该函数逐个字符比较两个字符串。它会同时扫描两个字符串,找到第一对不匹配的对应字符: 若这两个字符中较小的字符来自 string1,则判定 string1 更小,函数返回 t; 若较小的字符来自 string2,则判定 string1 更大,函数返回 nil; 若两个字符串完全匹配,返回值为 nil

字符对的比较基于其字符编码值: 需注意,在 ASCII 字符集中,小写字母的数值大于对应的大写字母; 数字和多数标点符号的数值小于大写字母; 任意 ASCII 字符小于非-ASCII 字符; 单字节非-ASCII 字符始终小于多字节非-ASCII 字符(see Text Representations)。

(string-lessp "abc" "abd")
     ⇒ t
(string-lessp "abd" "abc")
     ⇒ nil
(string-lessp "123" "abc")
     ⇒ t

当两个字符串长度不同时: 若匹配到 string1 的长度仍未发现差异,则返回 t; 若匹配到 string2 的长度仍未发现差异,则返回 nil; 空字符串小于任何非空字符串。

(string-lessp "" "abc")
     ⇒ t
(string-lessp "ab" "abc")
     ⇒ t
(string-lessp "abc" "")
     ⇒ nil
(string-lessp "abc" "ab")
     ⇒ nil
(string-lessp "" "")
     ⇒ nil

参数也可传入符号(symbol),此时会比较其打印名称(print name)。

Function: string< string1 string2

string<string-lessp 的别名。

Function: string-greaterp string1 string2

该函数按相反顺序比较 string1string2,等效于调用 (string-lessp string2 string1)

Function: string> string1 string2

string>string-greaterp 的别名。

Function: string-collate-lessp string1 string2 &optional locale ignore-case

若在指定 locale 设置的排序规则中 string1 小于 string2,该函数返回 tlocale区域 设置默认使用当前系统值)。排序规则不仅取决于字符串中字符的词典顺序,还遵循字符间关系的额外规则 —— 通常由 Emacs 运行时的区域设置环境,以及编译 Emacs 所链接的标准 C 库决定。

例如,排序时可能忽略标点和空白字符(see 序列):

(sort '("11" "12" "1 1" "1 2" "1.1" "1.2")
       :lessp #'string-collate-lessp)
     ⇒ ("11" "1 1" "1.1" "12" "1 2" "1.2")

此行为依赖于操作系统:例如在 Cygwin 系统中,无论区域设置如何,标点和空白字符永远不会被忽略。

可选参数 locale(字符串类型)会覆盖当前用于排序的区域设置标识符。该值依赖于操作系统:POSIX 系统可使用 "en_US.UTF-8",而 MS-Windows 系统需使用例如 "enu_USA.1252"。若将 locale 设置为 "POSIX""C"string-collate-lessp 的行为将等同于 string-lessp

(sort '("11" "12" "1 1" "1 2" "1.1" "1.2")
      :lessp (lambda (s1 s2) (string-collate-lessp s1 s2 "POSIX")))
     ⇒ ("1 1" "1 2" "1.1" "1.2" "11" "12")

ignore-case 非-nil,字符会转换为小写后进行大小写不敏感比较。但如果底层系统库未提供特定区域的排序规则,函数会降级使用 string-lessp,此时 ignore-case 参数被忽略,比较始终大小写敏感。

要在 MS-Windows 系统上模拟符合 Unicode 标准的排序,需将 w32-collate-ignore-punctuation 绑定为非-nil(因 MS-Windows 不支持将区域设置的字符集设为 "UTF-8")。

若系统不支持区域设置环境,此函数行为等同于 string-lessp

Function: string-version-lessp string1 string

该函数按词典顺序比较字符串,但会将连续的数字字符视为十进制数进行比较。因此根据该判定规则,‘foo2.png’ 会被判定为 “samller小于” ‘foo12.png’ —— 即便从纯词典顺序看,‘12’ “smaller小于” ‘2’。

Function: string-prefix-p string1 string2 &optional ignore-case

string1string2 的前缀(即 string2string1 开头),函数返回非-nil。若可选参数 ignore-case 非-nil,比较时会忽略大小写差异。

Function: string-suffix-p suffix string &optional ignore-case

suffixstring 的后缀(即 stringsuffix 结尾),函数返回非-nil。若可选参数 ignore-case 非-nil,比较时会忽略大小写差异。

Function: string-search needle haystack &optional start-pos

返回子串 needle 在字符串 haystack 中首次出现的位置。若指定 start-pos 非-nil,则从 haystack 的该位置开始搜索;未找到匹配时返回 nil。该函数仅比较字符串的字符本身,忽略文本属性,且匹配始终是大小写敏感的。

Function: compare-strings string1 start1 end1 string2 start2 end2 &optional ignore-case

该函数比较 string1string2 的指定子串: string1 的比较范围为从 start1(包含)到 end1(不包含);start1nil 表示字符串起始位置,end1nil 表示字符串长度; string2 的比较范围同理(start2end2)。

字符串比较基于字符的数值。如果两个字符串第一个不同的字符中,str1 对应的字符数值更小,那么 str1 就被认为小于 str2。若 ignore-case 非-nil,字符会先通过当前缓冲区的大小写表(see 大小写转换表)转换为大写,再进行比较。单字节字符串会转换为多字节形式参与比较(see Text Representations),因此单字节字符串与其多字节转换版本始终被判定为相等。

若两个字符串的指定部分完全匹配,函数返回值为 t。否则返回一个整数,该整数会指明两个字符串开头连续匹配的字符数量,以及哪个字符串更小: 整数的绝对值等于两个字符串开头匹配的字符数加 1;若 string1(或其指定部分)更小,该整数为负数。

Function: string-distance string1 string2 &optional bytecompare

该函数返回源字符串 string1 与目标字符串 string2 之间的 Levenshtein distance莱文斯坦距离。Levenshtein distanc 指将源字符串转换为目标字符串所需的单字符修改操作(删除、插入或替换)次数;它是字符串间 edit distance 的一种定义方式。

字符串的大小写会影响计算出的距离值,但字符串的文本属性会被忽略。若可选参数 bytecompare 非-nil,该函数会基于字节(而非字符)计算距离。基于字节的比较使用 Emacs 内部的字符表示方式,因此对于包含原始字节的多字节字符串,此方式会产生不准确的结果(see Text Representations);若需要对原始字节获得准确结果,可通过编码将字符串转换为单字节形式(see Explicit Encoding and Decoding)。

Function: assoc-string key alist &optional case-fold

该函数的作用与 assoc 类似,但要求 key 必须是字符串或符号,且比较过程通过 compare-strings 完成。符号会在比对前被转换为字符串。若可选参数 case-fold 非-nilkeyalist 中的元素会先转换为大写形式再进行比较。与 assoc 不同的是,该函数还能匹配 alist 中为字符串或符号的元素(而非仅 cons 类型元素)。具体而言,alist 可以是一个由字符串或符号组成的列表,而非严格意义上的关联列表(alist)。See 关联列表

另可参考 Comparing Text 中的 compare-buffer-substrings 函数,该函数用于比较缓冲区中的文本。而 string-match 函数可将正则表达式与字符串进行匹配,也可用于某种形式的字符串比较;参见 Regular Expression Searching。 See also the function compare-buffer-substrings in


Footnotes

(4)

有关排序规则及其区域(locale)依赖关系的更多信息,请参见The Unicode Collation Algorithm。部分标准 C 库(例如 GNU C 库,又称 glibc)实现了 Unicode 排序算法的大部分内容,并使用配套的区域数据 ——通用区域数据仓库(Common Locale Data Repository,简称 CLDR)。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike