Научитесь читать Common Lisp HyperSpec .
Строки: Последовательности , Массивы (одномерные векторы символов) и, ну, в общем, Строки . Это означает, что большинство из этих функций применимы.
Давайте посмотрим на УДАЛИТЬ . CLHS дает эту подпись:
remove item sequence &key from-end test test-not start end count key
=> result-sequence
Строки - это последовательности символов. Таким образом, вызов для удаления будет:
(remove #\/ "/foo/")
или (например)
(remove #\/ "/foo/" :start 2)
Помните: # \ a - это персонаж. # \ узел не является символом. Нелегальная. Строка "/foo/".
Элемент, который нужно УДАЛИТЬ из строки, должен быть символом. Ничего больше. Зачем? Поскольку TEST по умолчанию является EQL, а EQL сравнивает символ в строке с аргументом вашего элемента. Также ключ по умолчанию IDENTITY и не меняет элементы.
Что если ваш аргумент является строкой? Ну, тогда вы должны сделать больше:
(remove "/" "/abc/" :key #'string :test #'equal)
Это смотрит на каждый символ последовательности и превращает его в строку. Затем строка будет сравниваться с вашим элементом "/" с помощью функции EQUAL. Это работает также. Стоимость состоит в том, что ему нужно генерировать строку из каждого символа «/ abc /», каждая строка является новым объектом.
Еще один способ сделать это:
(remove "/" "/abc/" :test (lambda (a b) (eql (aref a 0) b)))
Выше извлекает первый символ «/» в каждом тесте и сравнивает его с символом из строки «/ abc /». Опять же, цена заключается в том, что ему нужно получить персонажа пять раз (в этом примере).
Так что лучший способ написать это, если ваш оригинальный объект представлен в виде строки:
(remove (aref "/" 0) "/abc/")
Выше мы получаем символ из строки "/" один раз, а затем REMOVE сравнивает этот символ с тестом EQL по умолчанию с каждым символом в строке - он возвращает новую строку тех символов, которые не являются EQL для # /.
Чего вы ожидаете? В Common Lisp это символ |? FOO |.
Также (удалить "foo" и "afoob") не работает, так как строка (здесь "foo") не является элементом строки. Помните, что символы являются элементами строк. Помните также, что строки с одним элементом типа «/» по-прежнему являются строками, а не символом. Таким образом, "/" и # / имеют разный тип. Первый - это строка, а второй - символ.
SUBSEQ извлекает последовательность из последовательности. Это означает, что он также извлекает строку из другой строки:
(subseq "0123456" 1 5)
where 1 is the start and 5 is the end index.
CONCATENATE добавляет последовательности. Это означает, что он также добавляет строки.
(concatenate 'string "abc" "123")
returns a new string with the strings "abc" and "123" appended.
Для удаления частей строки см. Также функции STRING-TRIM, STRING-LEFT-TRIM и STRING-RIGHT-TRIM.
Итак, как и в другом ответе на удаление подстрок из строки, вам нужно написать некоторый код для извлечения некоторых строк и затем объединить их.
ПОИСК ищет строки в строках.