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

2024-04-17

是否有一个函数可以检查字符串是否以某个子字符串结尾? Python 有endswith http://docs.python.org/2/library/stdtypes.html?highlight=endswith#str.endswith:

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

只需安装s.el https://github.com/magnars/s.el字符串操作库并使用它s-suffix? https://github.com/magnars/s.el#s-ends-with-suffix-s-optional-ignore-case谓词:

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

但如果你拒绝使用这个库,你就必须编写自己的函数。有string-prefix-p https://www.gnu.org/software/emacs/manual/html_node/elisp/Text-Comparison.html#index-string_002dprefix_002dp-255,它类似于 Pythonstr.startswith http://docs.python.org/2/library/stdtypes.html?highlight=startswith#str.startswith, in subr.el,它只是一个包装compare-strings https://www.gnu.org/software/emacs/manual/html_node/elisp/Text-Comparison.html#index-compare_002dstrings-256。根据Emacs 24.3 变更日志 https://www.gnu.org/software/emacs/news/NEWS.24.3:

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

string-suffix-p was 仅在 Emacs 24.4 中添加 http://emacsredux.com/blog/2014/02/02/a-peek-at-emacs-24-dot-4-new-string-manipulation-functions/,所以对于早期版本我写道:

(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.

如果你对函数进行字节编译,它的运行速度比伊夫·波姆斯 https://stackoverflow.com/users/83331/yves-baumes解决方案,尽管string-match是一个C函数。

ELISP> (setq str1 "miss."
             str2 "Ayo, lesson here, Bey. You come at the king, you best not miss.")
ELISP> (benchmark-run 1000000 (string-suffix-p str1 str2))
(4.697675135000001 31 2.789847821000066)
ELISP> (byte-compile 'string-suffix-p)
ELISP> (benchmark-run 1000000 (string-suffix-p str1 str2))
(0.43636462600000003 0 0.0)
ELISP> (benchmark-run 1000000 (string-match "miss\.$" str2))
(1.3447664240000001 0 0.0)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Emacs Lisp 中检查字符串是否以后缀结尾 的相关文章

随机推荐

  • imagesLoaded 方法不适用于 JQuery 砌体和无限滚动

    我一直在使用 JQuery masonry 现在我正在添加无限滚动 几乎每个砖石 砖块 中都有图像 在我使用无限滚动之前 图像加载得很好 一切都很棒 我为无限滚动添加了 javascript 的下一部分 并在内部添加了 imagesLoad
  • 使用 Visual Studio 2017 以 .NET Framework 2.0(不是 .NET Core 2.0)为目标

    我想为打开硬件监视器 https github com openhardwaremonitor openhardwaremonitor 它使用 NET Framework 2 0 同样 它不是 NET Core 2 0 当我克隆存储库并打开
  • 如何读取与 Rust 中的自定义类型关联的枚举值?

    我在 Rust 中有一个实现 如下所示 在主函数中 我正在读取一个值SalaryRange枚举 这将显示High So High This can be a complex type just using string for the qu
  • 如何将 tkinter 按钮垂直浮动在左侧

    我希望我的 tkinter 按钮 条目和文本垂直浮动在左侧的中间 我尝试过使用 pack 和 side left 但它只是水平堆叠它们 如果我可以垂直堆叠它们那就完美了 我尝试过使用网格 但无法将它们放在中间 我尝试过anchor w 但也
  • 如何设置特定Facebook页面的manage_pages权限?

    我如何将我的应用程序的管理页面权限仅设置为特定页面 现在我的应用程序获得了管理 Facebook 用户的所有页面的权限 我如何限制这一点并获得仅访问特定页面的权限 我正在使用一种简单的身份验证方法 app id xxxxxxxxxxxxx
  • Android Oreo (API26) 和 android.app.DownloadManager

    各位 此代码不适用于 Android Oreo 但在旧版本上可以 我可以看到通知和DownloadManager ACTION DOWNLOAD COMPLETE广播消息 Kotlin testButton setOnClickListen
  • OleDB INSERT 命令错误

    我有一个数据库 我使用 MS ACCESS 我有这个插入代码 我可以读取数据 但写入时出错 我按照说明操作 但它不起作用 这是我的代码 OleDbConnection con new OleDbConnection provider Mic
  • 设置 JOptionPane 对话框的助记符和热键

    是否可以为 JOptionPane 对话框中的按钮分配热键和助记符 我希望能够在 JOptionPane 生成的带有 是 否 和 取消 选项的消息对话框中 按 Y 键单击 是 按钮 按 N 键单击 否 按钮 然后按 escape 键激活转义
  • Kubernetes - 以编程方式找出服务 IP 范围 CIDR

    我需要一种方法来获取适用于所有 Kubernetes 集群的服务集群 IP 范围 如 CIDR 我尝试了以下方法 这对于使用 kubeadm 创建的集群效果很好 因为它会 grep apiserver pod 的参数 kubectl clu
  • 对数与平方根的 Big-O

    一般来说 以下内容总是正确的吗 log n O na a 1 s t a is any constant positive integer perhaps very large 如果不是的话 最大的值是多少a这个陈述对于哪些人来说是正确的
  • MySQL 加入不存在的地方

    我有一个连接两个表的 MySQL 查询 Voters 家庭 他们加入voters household id and household id 现在我需要做的是修改它 将选民表连接到第三个表 称为消除 voter id and elimina
  • 如何进行应用内购买去除广告

    我有 Android 游戏项目 我正在使用 ad mob 来投放广告 但是 如果有人想去掉广告就必须先付费怎么办 你能给我教程吗 因为我是 Android 和 Java 的新手 您只需在应用程序中创建一个按钮即可进行应用内购买 并且 一旦用
  • 使用 Gradle 运行命令行并保存输出结果

    我想使用 Gradle 运行命令行 该命令有一个输出 我在 Windows powershell 中运行此命令 mybat bat myArgs当我按回车键时 它会打印一些数字 如下所示 123456我想用 gradle 运行这个命令并保存
  • 在 SwiftUI 中创建自定义 Spacer() 时如何读取容器轴

    在 SwiftUI 中Spacer 文档 https developer apple com documentation swiftui spacer https developer apple com documentation swif
  • Sitecore - 如何导入内容?

    因此 我收到了一项新任务 将内容从网站导入到使用 Sitecore CMS 构建的新网站 我的客户基本上正在进行改造 以前的网站是使用非常旧的 CMS 构建的 所有内容都是 HTML 格式 我实际上正在考虑抓取旧网站并将所有内容转储为 cs
  • 在 Android Studio 上导入 panoramaGL

    我在项目中导入 PanoramaGL 库时遇到问题 这是图书馆https github com zarelaky panoramagl android tree master PanoramaGL https github com zare
  • 何时使用 HashMap 而不是 LinkedList 或 ArrayList,反之亦然

    为什么我们不能总是使用 HashMap 尽管它在添加 删除操作上比 ArrayList 或 LinkedList 高效得多 而且与元素的数量无关 我用 google 搜索了一下 发现了一些原因 但使用 HashMap 总有一种解决方法 而且
  • 获得令牌后如何从 Google Plus API 获取电子邮件地址

    我使用 oauth2 0 获得了 accesstoken 我能够获取人名 性别等 但无法获取用户的电子邮件地址 任何人都可以粘贴一些示例代码或任何有关如何从 google plus API 获取电子邮件地址的建议吗 如果用户明确授权您的应用
  • 匿名函数 C++

    我正在尝试使用该功能signal int void int from
  • 在 Emacs Lisp 中检查字符串是否以后缀结尾

    是否有一个函数可以检查字符串是否以某个子字符串结尾 Python 有endswith http docs python org 2 library stdtypes html highlight endswith str endswith