2

我正在尝试格式化以下表格的多行 TAB 分隔数据

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 函数(匹配字符串 10)。当以交互方式使用 replace-regexp 时,如果替换字符串中的 lisp 代码以 '\,' 开头,则会对其进行评估,并且 ./(match-string 10) 在交互调用 replace-regexp 时的行为与我预期的一样;

但是,上述代码块中的 \\,(match-string 10) 会产生错误。我试过一、二、三、四等'\',但它要么产生相同的错误,要么打印一个文字字符串。有谁知道使用此功能的方法或引用大于 9 的组号的方法?

非常感谢!

4

1 回答 1

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 ESC后使用query-replace-regexp

于 2012-08-15T23:45:01.133 回答