下面是一个例程,需要st环包含midentify
输出,并返回键值对的关联列表(比安全地设置Emacs变量更安全)。它也有它解析数值为实际数的优势在于:
(require 'cl) ; for "loop"
(defun midentify-output-to-alist (str)
(setq str (replace-regexp-in-string "\n+" "\n" str))
(setq str (replace-regexp-in-string "\n+\\'" "" str))
(loop for index = 0 then (match-end 0)
while (string-match "^\\(?:\\([A-Z_]+\\)=\\(?:\\([0-9]+\\(?:\\.[0-9]+\\)?\\)\\|\\(.*\\)\\)\\|\\(.*\\)\\)\n?" str index)
if (match-string 4 str)
do (error "Invalid line: %s" (match-string 4 str))
collect (cons (match-string 1 str)
(if (match-string 2 str)
(string-to-number (match-string 2 str))
(match-string 3 str)))))
你会使用这个功能,像这样:
(setq alist (midentify-output-to-alist my-output))
(if (assoc "ID_LENGTH" alist)
(setq id-length (cdr (assoc "ID_LENGTH" alist)))
(error "Didn't find an ID_LENGTH!"))
编辑:修改功能,正确处理空行和拖尾换行符。
正则表达式确实是一个野兽; Emacs regexps并不以其在眼睛上的易用性而闻名。把它分解一下:
- 最外层的模式是
^(?:valid-line)|(.*)
。它会尝试匹配有效行,或者匹配匹配组4中的整行(.*
)。如果(match-group 4 str)
不是nil
,则表示遇到无效行,并且会引发错误。
valid-line
是(word)=(?:(number)|(.*))
。如果匹配,则名称 - 值对的名称部分位于匹配字符串1中,如果该行的其余部分匹配一个数字,则该数字位于匹配字符串2中,否则该行的整个剩余部分是在匹配字符串3.
我喜欢你的* willy-nilly *评论,因为我只是喜欢这句话,而且它很有道理。我一直想知道这个数字问题(我想我可以只使用*数字到字符串*),所以你做的很好......但是*圣·摩尔*!它需要我花一个星期的时间才能找出正则表达式(我已经习惯了扩展正则表达式,并减少了反斜杠:) ......我会习惯它,我确信.... *但是:(我得到一个错误:*(错误“无效的行:”) 信号(错误(“无效的行:”)) 错误(“无效的行:%s”“”) (if(match-string 4 str)(错误“Invalid line:%s”(match-string 4 str))(cons(ma * –
PS。*错误*似乎是由尾随的换行引起的。 –
* @ Sean:*感谢您添加换行符......在附注中:我围绕正则表达式问题(至少现在是这样,直到我更习惯于elisp),我做了一个包装,希望没有一些可怕的副作用这我还没有意识到..我已经把它叫做[Ree:Regex; Easy on the Eyes](http://paste.ubuntu.com/751190/):)它使用C-),C- ),C- |插入Unicode的外观,反之亦然根据3个Unicode字符中任何一个字符的存在情况切换值...例如:'(ree“^❨:❨[A-Z _] +❩=❨❨:[0-9] +❨: \。[0-9] +❩❩❙❨。*❩❩❙❨。*❩❩\ n?“)' –