Подтвердить что ты не робот

Elisp для разделения строки. персонаж

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

4b9b3361

Ответ 1

Вот официальная документация для функции split-string - 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" "\\.") будет работать нормально, как ожидалось.

Ответ 2

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

Если SEPARATORS не равен нулю, это должно быть регулярное выражение, соответствующее тексту, которое разделяет, но не является частью подстрок. Если nil по умолчанию имеет разделители-разделители по умолчанию, обычно "[\ 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))))