Проверьте, является ли строка всеми заглавными буквами в шепелявости Emacs?

все. Я задавался вопросом, имела ли шепелявость Emacs встроенную функцию для проверки, если строка сделана полностью из капитализированных символов. Вот то, что я использую прямо сейчас:

(setq capital-letters (string-to-list "ABCDEFGHIJKLMNOPQRSTUVWXYZ"))

(defun chars-are-capitalized (list-of-characters)
  "Returns true if every character in a list of characters is a capital         
letter. As a special case, the empty list returns true."
  (cond
   ((equal list-of-characters nil) t)
   ((not (member (car list-of-characters) capital-letters)) nil)
   (t (chars-are-capitalized (cdr list-of-characters)))))

(defun string-is-capitalized (string)
  "Returns true if every character in a string is a capital letter. The         
empty string returns true."
  (chars-are-capitalized (string-to-list string)))

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

5
задан Masterofpsi 25 January 2010 в 02:26
поделиться

3 ответа

Применительно к другим ответам:

  1. Использование Неужели Хорошая идея: он выделит новую строку, она не найдет Если строка имеет не алфавитные символы (кажется, что вы хотите запретить), и он тоже работает на целых числах (которые Emacs использует для символов).

  2. Использование String-Match лучше - это исправляет все эти проблемы. Как показывает Trey, вам нужно сделать это, когда - это поиск корпуса NIL , в противном случае Emacs может относиться к нему в качестве поиска нечувствительности. Но String-Match-P еще лучше, поскольку он избегает изменения данных сопоставления. (Emacs сохраняет эти данные после любого матча, и если вы используете STRING-MATTH , то вы перезапишите его, что может сломать код, который использует вашу функцию.)

  3. Другая проблема - сама регеек. Использование «^ ... $» означает, что EMACS будет искать некоторую строку с соответствующим контентом - и если ваша строка имеет новые символы Newline, это может заставить его вернуть божественный результат. Вам нужно использовать обратную челюсть-нести и обратную косулью, которая соответствует только началу и концу строки.

Итак, правильная версия:

(defun string-is-capitalized (str)
  (let ((case-fold-search nil))
    (string-match-p "\\`[A-Z]*\\'" str)))

(BTW, обычная конвенция в Emacs Lisp - это использовать --P для предикатов, как в String-capitalized-p . )

12
ответ дан 18 December 2019 в 06:50
поделиться

Я не знаю о встроенной функции, которая делает то, что вы хотите, но это делает:

(defun string-all-caps-p (string)
  "Return non-nil iff STRING is all capital letters."
  (save-match-data
    (let ((case-fold-search nil))
      (string-match "\\`[A-Z]+\\'" string))))

Правка: Изменено, чтобы использовать ` и ` в соответствии с отзывами Илая Барзилай .

Это позволяет использовать не A-Z графики (не то, что вы просили, но, возможно, интересно):

(defun string-has-no-lowercase (string)
  "Return true iff STRING has no lowercase"
  (equal (upcase string) string))
7
ответ дан 18 December 2019 в 06:50
поделиться

Просто дикая догадка, но что, если вы сделаете копию строки, подняв ее (я не очень много знаю о Lisp, но быстрый поиск Google, который сказал, что есть функция «поднятия», А затем проверьте, являются ли две строки одинаковыми? Если есть, то оригинал должен быть во всех упселлерах: P

0
ответ дан 18 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: