все. Я задавался вопросом, имела ли шепелявость 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), но я задавался вопросом, пропускал ли я некоторую очевидную функцию, о которой я должен знать.
Применительно к другим ответам:
Использование
Неужели Хорошая идея: он выделит новую строку, она не найдет Если строка имеет не алфавитные символы (кажется, что вы хотите запретить), и он тоже работает на целых числах (которые Emacs использует для символов).
Использование String-Match
лучше - это исправляет все эти проблемы. Как показывает Trey, вам нужно сделать это, когда - это поиск корпуса
NIL
, в противном случае Emacs может относиться к нему в качестве поиска нечувствительности. Но String-Match-P
еще лучше, поскольку он избегает изменения данных сопоставления. (Emacs сохраняет эти данные после любого матча, и если вы используете STRING-MATTH
, то вы перезапишите его, что может сломать код, который использует вашу функцию.)
Другая проблема - сама регеек. Использование «^ ... $»
означает, что 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
. )
Я не знаю о встроенной функции, которая делает то, что вы хотите, но это делает:
(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))
Просто дикая догадка, но что, если вы сделаете копию строки, подняв ее (я не очень много знаю о Lisp, но быстрый поиск Google, который сказал, что есть функция «поднятия», А затем проверьте, являются ли две строки одинаковыми? Если есть, то оригинал должен быть во всех упселлерах: P