1

我想从由制表符分隔的一行文本中创建一个单词列表。我想基本上将行拆分为原子,按制表符拆分。

下面的代码是一种伪代码,但这是做这类事情的最佳方法吗?

这是我的第一次尝试:-

(defun get-hdr()
    ;obviously point must be positioned on correct line
    (let (mylist)
      (while(not (end-of-line)
         (while(re-search-forward ("[A-Za-z]+[^\t\n]" nil t)
           (append (match-string 1) mylist)      
         ))
      ))
   )
)

如何让我的函数返回列表 mylist?

4

1 回答 1

1

您只需在循环结束时对其进行评估。

(defun get-hdr ()
  (let (mylist)
     (while (not (end-of-line))  ; missing closing parenthesis added
        (while (re-search-forward ("[A-Za-z]+[^\t\n]" nil t)) ; ditto
           (setq mylist (append (match-string 1) mylist)) ) ) ; note setq
     mylist) )

不过,习惯上只使用cons而不是append在这种情况下;然后最后,您可能想要反转列表。

(defun get-hdr ()
  (let (mylist)
     (while (not (end-of-line))
        (while (re-search-forward ("[A-Za-z]+[^\t\n]" nil t))
           (setq mylist (cons (match-string 1) mylist) ) ) )
     (reverse mylist)) )

另请参阅http://www.gnu.org/software/emacs/manual/html_node/elisp/Building-Lists.htmlappend ,它在更广泛的背景下讨论了 的功能。

在许多情况下,您的函数不应与用户的正则表达式匹配数据或缓冲区位置混淆;考虑在表单周围添加包装器save-excursionsave-match-datalet

但是,出于您的既定目的,也许您所需要的只是

(split-string (buffer-substring-no-properties (point) (line-end-position)) "\t")

文档

于 2013-04-16T10:12:36.310 回答