Как сравнить случай двух строк в Clojure?

У меня есть функция Clojure autocomplete который берет префикс и возвращает возможный autocompletion этой строки. Например, если вход abs, Я получил absolute как возможное полное слово.

Проблема в том, что функция выполняет регистронезависимое совпадение для префикса, поэтому, если у меня есть Abs в качестве ввода префикса, я все еще получаю absolute вместо Absolute,

Каков будет правильный способ получить окончательное завершение строки, которое соответствует регистру исходного введенного префикса?

Итак, функция case-match это может работать как

(case-match "Abs" "absolute")  => "Absolute"

2 ответа

Решение

Вы можете использовать строку префикса в качестве префикса к результату поиска без учета регистра. Просто используйте subs чтобы удалить длину префикса из результата поиска:

(defn case-match [prefix s]
  (str prefix (subs s (count prefix))))

(case-match "Abs" "absolute")
=> "Absolute"

Это предполагает ваш autocomplete функция остается отдельной, и case-match будет применяться к его результату.

Кроме того, вы можете пойти с startsWith

(defn case-match
  [prefix s]
  (when (.startsWith (clojure.string/lower-case s)
                     (clojure.string/lower-case prefix))
       s))

(case-match "Abs" "absolute")
#=> "absolute"
(case-match "Absence" "absolute")
#=> nil
Другие вопросы по тегам