Emacs删除字符串中的最后一个目录

use*_*035 3 regex elisp

假设,我有一个目录名称为"/ sites/all/modules"的字符串.我想删除它的最后一个组件,生成:"/ sites/all".我试过,创建一个函数,但它返回:"/ sites/all/modules".

(defun remove-last-dir (dir)
      (replace-regexp-in-string "(.*)/.+" "\1" dir))

(print (remove-last-dir "/sites/all/modules"))
Run Code Online (Sandbox Code Playgroud)

phi*_*ils 7

ELISP> (directory-file-name (file-name-directory "/sites/all/modules"))
"/sites/all"
Run Code Online (Sandbox Code Playgroud)

file-name-directory获取给定路径的目录组件.Emacs将结束的路径视为/目录,因此返回值将具有尾随/

directory-file-name返回路径的非目录版本(这意味着它会/从值中删除尾随,如果有的话).

请注意,如果您的原始参数是(或可能),/sites/all/modules/那么您首先要调用directory-file-name它(否则file-name-directory只返回原始值,因为目录路径的"目录组件"本身).

  • 除了速度(除非它严格地在关键路径中,在这种情况下我不这么认为)我更喜欢这个解决方案,因为它在语义上更具说明性.它做了预期的,更具说服力的.它还使用库函数,用于执行此操作.现在这可能会变慢,但可能会在将来进行优化.此外,它可以考虑不同的目录分隔符,具体取决于底层架构等. (4认同)