2012-08-15 76 views
2

我试图格式选项卡的多行分隔下面调用replace-match时,如何评估替换字符串中的lisp表达式?

ID Name Duration Start_Date Finish_Date Predecessors Successors Resource_Group Deadline Constraint_Type 

形式的数据转换成使用下面的Lisp代码字段列表。

(while (re-search-forward "\\(.*\\)\t\\(.*\\)\t\\(.*\\)\t\\(.*\\)\t\\(.*\\)\t\\(.*\\)\t\\(.*\\)\t\\(.*\\)\t\\(.*\\)\t\\(.*\\)\t\\(.*\\)\t\\(.*\\)\t\\(.*\\)\t\\(.*\\)\t\\(.*\\)\t\\(.*\\)" nil t) 
    (replace-match 
"* \\2 
    :PROPERTIES: 
    :task_id: \\1 
    :duration: \\3 
    :start: \\4 
    :finish: \\5 
    :predecessors: \\6 
    :successors: \\7 
    :resource_group: \\8 
    :deadline: \\9 
    :constraint_type: \\,(match-string 10) 
    :END:" 
nil nil)) 

代码按预期执行,直到达到第10个回参考匹配的字符串。我发现一个解决方案来反引用大于9的组是使用lisp函数(match-string 10)。当以交互方式使用replace-regexp时,如果替换字符串中的lisp代码被前缀为'\,',并且./(match-string 10)的行为与我期望的交互地调用replace-regexp时相同;

但是,上述代码块中的\\,(匹配字符串10)会产生错误。我已经尝试了一,二,三,四等'',但它要么产生相同的错误,要么打印字符串。有谁知道使用此功能的方法或参考大于9的组号的方法吗?

非常感谢!

+0

你应该也可以upvote你自己选择的正确答案。 – 2012-08-16 00:48:14

+0

我该如何upvote?我是新人,在常见问题解答中找不到关于投票如何/为什么会起作用的任何内容。有关如何工作的任何提示将有所帮助,谢谢。 – user1593649 2012-08-17 13:44:22

回答

5

而不是在替换字符串中使用\DIGIT序列,该字符串似乎不支持大于9的数字,您可以自己构建替换字符串。喜欢的东西:

(replace-match 
(concat "* " (match-string 2) "\n" 
     " :PROPERTIES:\n" 
     " :task_id: "   (match-string 1) "\n" 
     " :duration: "  (match-string 3) "\n" 
     " :start: "   (match-string 4) "\n" 
     " :finish: "   (match-string 5) "\n" 
     " :predecessors: " (match-string 6) "\n" 
     " :successors: "  (match-string 7) "\n" 
     " :resource_group: " (match-string 8) "\n" 
     " :deadline: "  (match-string 9) "\n" 
     " :constraint_type: " (match-string 10) "\n" 
     " :END:") 
nil t) 

哦,顺便说一句,\,(...)建设不replace-match支持,只能通过query-replace-regexp

编辑:另请注意,\,(...)不会简单地进入替换字符串。那里有相当多的魔法。在窗帘后面使用C-x ESC ESCquery-replace-regexp

+0

谢谢!这很好,谢谢你指出\,(...)不被replace-match支持。 – user1593649 2012-08-16 00:49:40

相关问题