检查字符串是否以Emacs Lisp中的后缀结尾

时间:2014-03-14 11:28:42

标签: string emacs elisp substring string-matching

是否有一个函数检查字符串是否以某个子字符串结尾? Python有endswith

>>> "victory".endswith("tory")
True

2 个答案:

答案 0 :(得分:8)

只需安装s.el字符串操作库并使用其s-suffix?谓词:

(s-suffix? "turn." "...when it ain't your turn.") ; => t

但是如果你拒绝使用这个库,你必须编写自己的函数。在subr.el中有string-prefix-p,它类似于Python的str.startswith,它只是compare-strings的包装。根据{{​​3}}:

** New function `string-prefix-p'.
(This was actually added in Emacs 23.2 but was not advertised at the time.)

string-suffix-pEmacs 24.3 changelog,因此对于早期版本我写道:

(defun string-suffix-p (str1 str2 &optional ignore-case)
  (let ((begin2 (- (length str2) (length str1)))
        (end2 (length str2)))
    (when (< begin2 0) (setq begin2 0))
    (eq t (compare-strings str1 nil nil
                           str2 begin2 end2
                           ignore-case))))

(when (< begin2 0) (setq begin2 0))是一种解决方法,因为如果您将负数传递给compare-strings,则会使用*** Eval error *** Wrong type argument: wholenump, -1进行限制。

如果字节编译该函数,它的工作速度比added only in Emacs 24.4解决方案快,即使{​​{1}}是C函数。

string-match

答案 1 :(得分:5)

您可以使用正则表达式调用string-match函数。

(if (string-match "tory\\'" "victory")
    (message "victory ends with tory.")
   (message "victory does not ends with tory."))