Spec-Zone.ru › Elisp

Сравнение символов и строк

Функция: 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
Функция: string-equal string1 string2

Эта функция возвращает t, если символы двух строк полностью совпадают. В качестве аргументов также допускаются символы; в этом случае используются имена символов. Регистр всегда учитывается независимо от case-fold-search.

Эта функция эквивалентна equal при сравнении двух строк (см. Предикаты равенства). В частности, текстовые свойства двух строк игнорируются; используйте equal-including-properties, если нужно различать строки, отличающиеся только текстовыми свойствами. Однако, в отличие от equal, если какой-либо из аргументов не является строкой или символом, string-equal сигнализирует об ошибке.

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

Однобайтовая и многобайтовая строки равны в смысле string-equal тогда и только тогда, когда они содержат одну и ту же последовательность кодов символов, все из которых находятся в диапазоне 0–127 (ASCII). См. Представления текста.

Функция: string= string1 string2

string= — другое имя для string-equal.

Функция: string-equal-ignore-case string1 string2

string-equal-ignore-case сравнивает строки, игнорируя различия в регистре, подобно char-equal, когда case-fold-search равно t.

Функция: string-collate-equalp string1 string2 &optional locale ignore-case

Эта функция возвращает t, если string1 и string2 равны согласно правилам сортировки указанной локали locale, по умолчанию соответствующей текущей системной локали. Правило сортировки определяется не только лексикографическим порядком символов в string1 и string2, но и дополнительными правилами, учитывающими отношения между этими символами. Обычно оно определяется локалью, в которой работает Emacs, и стандартной библиотекой C, с которой был скомпонован Emacs.

Например, символы с разными кодовыми точками, но одинаковым значением, такие как различные символы Unicode с грависом, в некоторых локалях могут считаться равными:

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

Необязательный аргумент locale — строка, которая переопределяет текущий идентификатор локали для сортировки. Значение зависит от системы: locale "en_US.UTF-8" применима в системах POSIX, тогда как в системах MS-Windows это, например, "enu_USA.1252".

Если ignore-case не равно nil, символы сравниваются без учета регистра путем преобразования в нижний регистр. Однако если базовая системная библиотека не предоставляет правила сортировки, зависящие от локали, эта функция использует string-equal; в таком случае аргумент ignore-case игнорируется, а сравнение всегда учитывает регистр.

Чтобы эмулировать сортировку, совместимую с Unicode, в системах MS-Windows, привяжите w32-collate-ignore-punctuation к значению, не равному nil, поскольку часть локали, задающая кодировку, не может быть "UTF-8" в MS-Windows.

Если ваша система не поддерживает среду локали, эта функция работает как string-equal.

Не используйте эту функцию для сравнения имен файлов на равенство, поскольку файловые системы обычно не учитывают лингвистическую эквивалентность строк, которую реализует сортировка.

Функция: string-lessp string1 string2

Эта функция сравнивает две строки посимвольно. Она просматривает обе строки одновременно, чтобы найти первую пару соответствующих друг другу несовпадающих символов. Если меньший из этих символов находится в string1, то string1 меньше, и функция возвращает t. Если меньший символ находится в string2, то string1 больше, и функция возвращает nil. Если строки полностью совпадают, возвращается nil.

Пары символов сравниваются по их кодам. Помните, что в наборе символов ASCII строчные буквы имеют более высокие числовые значения, чем соответствующие им прописные; цифры и многие знаки пунктуации имеют числовые значения ниже, чем у прописных букв. Символ ASCII меньше любого символа, не относящегося к ASCII. Однако, поскольку у однобайтовых и многобайтовых строк общим является только набор символов ASCII, сравнивать другие символы между строками этих двух типов обычно не имеет смысла (см. Представления текста).

(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

В качестве аргументов также допускаются символы; в этом случае сравниваются их печатные имена.

Функция: string< string1 string2

string< — другое имя для string-lessp.

Функция: string-greaterp string1 string2

Эта функция возвращает результат сравнения string1 и string2 в обратном порядке, то есть эквивалентна вызову (string-lessp string2 string1).

Функция: string> string1 string2

string> — другое имя для string-greaterp.

Функция: string-collate-lessp string1 string2 &optional locale ignore-case

Эта функция возвращает t, если string1 меньше string2 в порядке сортировки указанной локали locale, по умолчанию соответствующей текущей системной локали. Порядок сортировки определяется не только лексикографическим порядком символов в string1 и string2, но и дополнительными правилами, учитывающими отношения между этими символами. Обычно он определяется локалью, в которой работает Emacs, и стандартной библиотекой C, с которой был скомпонован Emacs.

Например, при сортировке знаки пунктуации и пробельные символы могут игнорироваться (см. Последовательности):

(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 — строка, которая переопределяет текущий идентификатор локали для сортировки. Значение зависит от системы: locale "en_US.UTF-8" применима в системах POSIX, тогда как в системах 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 игнорируется, а сравнение всегда учитывает регистр.

Чтобы эмулировать сортировку, совместимую с Unicode, в системах MS-Windows, привяжите w32-collate-ignore-punctuation к значению, не равному nil, поскольку часть локали, задающая кодировку, не может быть "UTF-8" в MS-Windows.

Если ваша система не поддерживает среду локали, эта функция работает как string-lessp.

Функция: string-version-lessp string1 string2

Эта функция сравнивает строки лексикографически, за исключением того, что последовательности цифр рассматривает как десятичные числа и сравнивает числовые значения. Поэтому согласно этому предикату ‘foo2.png’ «меньше», чем ‘foo12.png’, даже если ‘12’ лексикографически «меньше», чем ‘2’.

Функция: string-prefix-p string1 string2 &optional ignore-case

Эта функция возвращает значение, не равное nil, если string1 является префиксом string2, то есть если string2 начинается с string1. Если необязательный аргумент ignore-case не равен nil, при сравнении игнорируются различия в регистре.

Функция: string-suffix-p suffix string &optional ignore-case

Эта функция возвращает значение, не равное nil, если suffix является суффиксом string, то есть если string заканчивается на suffix. Если необязательный аргумент ignore-case не равен nil, при сравнении игнорируются различия в регистре.

Функция: string-search needle haystack &optional start-pos

Возвращает позицию первого вхождения needle в haystack; оба аргумента должны быть строками. Если start-pos не равен nil, поиск начинается с этой позиции в haystack. Если совпадение не найдено, возвращает nil. При сравнении эта функция учитывает только символы строк; текстовые свойства игнорируются. Сравнение всегда учитывает регистр.

Функция: compare-strings string1 start1 end1 string2 start2 end2 &optional ignore-case

Эта функция сравнивает заданную часть string1 с заданной частью string2. Заданная часть string1 начинается с индекса start1 (включительно) и заканчивается перед индексом end1 (не включительно); nil для start1 означает начало строки, а nil для end1 означает длину строки. Аналогично, заданная часть string2 начинается с индекса start2 и заканчивается перед индексом end2.

Строки сравниваются по числовым значениям их символов. Например, str1 считается меньше str2, если первый различающийся символ имеет меньшее числовое значение. Если ignore-case не равен nil, перед сравнением символы преобразуются в верхний регистр с использованием таблицы регистра текущего буфера (см. Таблица регистра). Однобайтовые строки преобразуются в многобайтовые для сравнения (см. Представления текста), поэтому однобайтовая строка и ее многобайтовое представление всегда считаются равными.

Если указанные части обеих строк совпадают, возвращается t. В противном случае возвращается целое число, которое указывает, сколько начальных символов совпадает, а также какая строка меньше. Абсолютное значение числа на единицу больше количества совпадающих начальных символов двух строк. Число отрицательное, если string1 (или указанная ее часть) меньше.

Функция: string-distance string1 string2 &optional bytecompare

Эта функция возвращает расстояние Левенштейна между исходной строкой string1 и целевой строкой string2. Расстояние Левенштейна — это число изменений отдельных символов — удалений, вставок или замен, — необходимых для преобразования исходной строки в целевую; это один из возможных способов определить расстояние редактирования между строками.

Регистр букв учитывается при вычислении расстояния, но текстовые свойства игнорируются. Если необязательный аргумент bytecompare не равен nil, функция вычисляет расстояние в байтах, а не в символах. Побайтовое сравнение использует внутреннее представление символов в Emacs, поэтому результаты будут неточными для многобайтовых строк, содержащих необработанные байты (см. Представления текста); если для необработанных байтов нужны точные результаты, сделайте строки однобайтовыми, закодировав их (см. Явное кодирование и декодирование).

Функция: assoc-string key alist &optional case-fold

Эта функция работает как assoc, за исключением того, что key должен быть строкой или символом, а сравнение выполняется с помощью compare-strings. Перед проверкой символы преобразуются в строки. Если case-fold не равен nil, перед сравнением key и элементы alist преобразуются в верхний регистр. В отличие от assoc, эта функция также может находить элементы списка ассоциаций, которые являются строками или символами, а не консами. В частности, alist может быть списком строк или символов, а не собственно списком ассоциаций. См. Списки ассоциаций.

См. также функцию compare-buffer-substrings в разделе Сравнение текста, которая позволяет сравнивать текст в буферах. Функцию string-match, сопоставляющую регулярное выражение со строкой, можно использовать для одного из видов сравнения строк; см. Поиск по регулярным выражениям.

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Text-Comparison.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API