2

以下の形式のタブ区切りデータの多くの行をフォーマットしようとしています

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 が対話的に呼び出されたときに期待どおりに動作します。

ただし、上記のコード ブロックの \\,(match-string 10) はエラーを生成します。1、2、3、4 などの '\' を試しましたが、同じエラーが発生するか、リテラル文字列が出力されます。この関数を使用する方法、または 9 より大きいグループ番号を参照する方法を知っている人はいますか?

どうもありがとう!

4

1 に答える 1

5

\DIGIT9 より大きい数値をサポートしていないように見える置換文字列でシーケンスを使用する代わりに、置換文字列を自分で明示的に作成できます。何かのようなもの:

(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 ESCafter を使用しquery-replace-regexpます。

于 2012-08-15T23:45:01.133 に答える