Elisp split-string функция для разделения строки.персонаж - PullRequest
17 голосов
/ 04 июня 2011

Я пытаюсь разбить строку, используя функцию 'split-string' на основе. персонаж. Но (split-string "1.2.3" ".") не работает вообще. Он просто возвращает список с переменным количеством пустых строк. Является . специальный символ, который нужно экранировать или указать другим способом?

Ответы [ 2 ]

25 голосов
/ 06 июня 2011

Вот официальная документация для функции разделения строк - http://www.gnu.org/software/emacs/manual/html_mono/elisp.html#Creating-Strings.

Второй аргумент функции split-string в (split-string "1.2.3" "\.") является регулярным выражением и в результате оба '.' символ и символ '\' имеют особое значение. Итак '.' символ должен быть экранирован, и даже символ '\' должен быть экранирован другим '\'. (split-string "1.2.3" "\\.") будет работать нормально, как и ожидалось.

8 голосов
/ 03 августа 2014

Если вы звоните describe-function на split-string, обычно нажимая F1 f split-string Введите , вы можете увидеть в документации, чтовторой параметр - это не просто символ, а регулярное выражение:

Если SEPARATORS не ноль, это должен быть текст регулярного выражения, который разделяет, но не является частью подстрок.Если nil, то по умолчанию это `split-string-default-separators ', обычно" [\ f \ t \ n \ r \ v] + ", и OMIT-NULLS принудительно устанавливается на t.

В то время как для большинства простых строковых операций достаточно встроенных функций Emacs, но когда вы интенсивно используете строковые манипуляции в коде Elisp, s.el сторонняя библиотека обязательна.Вы можете установить его через менеджер пакетов Emacs, запустив команду package-install с s в качестве имени пакета.Предположим, у вас есть несколько функций в нескольких модулях, которые все что-то делают со строками, объединением, разбиением, использованием заглавных букв, сравнением, обрезкой пробелов и так далее.Имеет смысл иметь все строковые функции в общем пространстве имен, поэтому альтернатива s.el встроенному split-string будет s-split:

(s-split "\\." "1.2.3") ; ("1" "2" "3")

Например, если вам нужно преобразовать строку " 1-2-3 " в "3.2.1", вы можете написать:

(s-reverse (s-join "." (s-split "-" (s-trim z))))
...