如果参数表示同一个字符,返回 t,否则返回 nil。如果 case-fold-search 非-nil,此函数会忽略大小写差异。
(char-equal ?x ?x)
⇒ t
(let ((case-fold-search nil))
(char-equal ?x ?X))
⇒ nil
如果两个字符串的字符完全匹配,返回 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。
string= 是 string-equal 的别名。
string-equal-ignore-case 比较字符串时忽略大小写,类似于 case-fold-search 为 t 时的 char-equal。
该函数会根据指定 locale区域 的排序规则比较两个字符串,若二者相等则返回 t;若未指定区域,默认使用当前系统的区域设置。排序规则的判定不仅基于字符串 string1 和 string2 中字符的字典序,还包含字符间关联关系的额外规则。这类规则通常由 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。
请勿使用此函数比较文件名是否相等,因为文件系统通常不遵循排序功能所实现的字符串语言等效规则。
该函数逐个字符比较两个字符串。它会同时扫描两个字符串,找到第一对不匹配的对应字符:
若这两个字符中较小的字符来自 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)。
string< 是 string-lessp 的别名。
该函数按相反顺序比较 string1 和 string2,等效于调用 (string-lessp string2 string1)。
string> 是 string-greaterp 的别名。
若在指定 locale 设置的排序规则中 string1 小于 string2,该函数返回 t(locale区域 设置默认使用当前系统值)。排序规则不仅取决于字符串中字符的词典顺序,还遵循字符间关系的额外规则 —— 通常由 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。
该函数按词典顺序比较字符串,但会将连续的数字字符视为十进制数进行比较。因此根据该判定规则,‘foo2.png’ 会被判定为 “samller小于” ‘foo12.png’ —— 即便从纯词典顺序看,‘12’ “smaller小于” ‘2’。
若 string1 是 string2 的前缀(即 string2 以 string1 开头),函数返回非-nil。若可选参数 ignore-case 非-nil,比较时会忽略大小写差异。
若 suffix 是 string 的后缀(即 string 以 suffix 结尾),函数返回非-nil。若可选参数 ignore-case 非-nil,比较时会忽略大小写差异。
返回子串 needle 在字符串 haystack 中首次出现的位置。若指定 start-pos 非-nil,则从 haystack 的该位置开始搜索;未找到匹配时返回 nil。该函数仅比较字符串的字符本身,忽略文本属性,且匹配始终是大小写敏感的。
该函数比较 string1 和 string2 的指定子串:
string1 的比较范围为从 start1(包含)到 end1(不包含);start1 为 nil 表示字符串起始位置,end1 为 nil 表示字符串长度;
string2 的比较范围同理(start2 到 end2)。
字符串比较基于字符的数值。如果两个字符串第一个不同的字符中,str1 对应的字符数值更小,那么 str1 就被认为小于 str2。若 ignore-case 非-nil,字符会先通过当前缓冲区的大小写表(see 大小写转换表)转换为大写,再进行比较。单字节字符串会转换为多字节形式参与比较(see Text Representations),因此单字节字符串与其多字节转换版本始终被判定为相等。
若两个字符串的指定部分完全匹配,函数返回值为 t。否则返回一个整数,该整数会指明两个字符串开头连续匹配的字符数量,以及哪个字符串更小:
整数的绝对值等于两个字符串开头匹配的字符数加 1;若 string1(或其指定部分)更小,该整数为负数。
该函数返回源字符串 string1 与目标字符串 string2 之间的 Levenshtein distance莱文斯坦距离。Levenshtein distanc 指将源字符串转换为目标字符串所需的单字符修改操作(删除、插入或替换)次数;它是字符串间 edit distance 的一种定义方式。
字符串的大小写会影响计算出的距离值,但字符串的文本属性会被忽略。若可选参数 bytecompare 非-nil,该函数会基于字节(而非字符)计算距离。基于字节的比较使用 Emacs 内部的字符表示方式,因此对于包含原始字节的多字节字符串,此方式会产生不准确的结果(see Text Representations);若需要对原始字节获得准确结果,可通过编码将字符串转换为单字节形式(see Explicit Encoding and Decoding)。
该函数的作用与 assoc 类似,但要求 key 必须是字符串或符号,且比较过程通过 compare-strings 完成。符号会在比对前被转换为字符串。若可选参数 case-fold 非-nil,key 与 alist 中的元素会先转换为大写形式再进行比较。与 assoc 不同的是,该函数还能匹配 alist 中为字符串或符号的元素(而非仅 cons 类型元素)。具体而言,alist 可以是一个由字符串或符号组成的列表,而非严格意义上的关联列表(alist)。See 关联列表。
另可参考 Comparing Text 中的 compare-buffer-substrings 函数,该函数用于比较缓冲区中的文本。而 string-match 函数可将正则表达式与字符串进行匹配,也可用于某种形式的字符串比较;参见 Regular Expression Searching。
See also the function compare-buffer-substrings in
有关排序规则及其区域(locale)依赖关系的更多信息,请参见The Unicode Collation Algorithm。部分标准 C 库(例如 GNU C 库,又称 glibc)实现了 Unicode 排序算法的大部分内容,并使用配套的区域数据 ——通用区域数据仓库(Common Locale Data Repository,简称 CLDR)。