Thursday, March 24, 2016

パターンのある文の翻訳 (Emacs Lisp)

次のような練習問題(一部)がある.これを日本語に翻訳したいと思っている.

The $200$ is the $\\green{\\text{whole}}$. We are trying to find the $\\pink{\\text{part}}$ that makes up $11\\%$ of it:
The $25$ is the $\\green{\\text{whole}}$. We are trying to find the $\\pink{\\text{part}}$ that makes up $12\\%$ of it:

良く見るとこれは数字が異なるだけの問題であるので,regexp で,次の置換をすれば良いことがわかる.

The $\(.*\)$ is the $\(.*\)$. We are trying to find the $\(.*\)$ that makes up $\(.*\)$ of it:
$\1$ は $\2$ です.私達はその $\4$ となるだけの $\3$ を探しています:

しかし,

The $200$ is the $\\green{\\text{whole}}$. We are trying to find the $\\pink{\\text{part}}$ that makes up $11\\%$ of it:



The $\(.*\)$ is the $\(.*\)$. We are trying to find the $\(.*\)$ that makes up $\(.*\)$ of it:

にするのも面倒であるので,これもコンピュータにやってもらおうと

(query-replace-regexp "\\$[^\\$]+\\$" "$\\\\(.*\\\\)$")

と書いたのであるが,なぜかこの regexp では $\\green{\\text{whole}}$ の部分がマッチしない.

仕方ないので,次のようなプログラムを書いた.

(let ((finishp nil))
  (while (null finishp)
    (progn
      (setq match-start (search-forward "$" nil t))
      (setq match-end   (search-forward "$" nil t))
      (setq finishp (or (null match-start) (null match-end)))
      (if (null finishp)
          (progn
            (kill-region match-start match-end)
            (insert "\\(.*\\)$"))))))

これは上手く働くのだが,しかしどうして上記の regexp が上手くいかないのかわからない.どなたか理由のわかる方教えて下さい.

No comments:

Post a Comment