ここに私が持っているものがあります:
{a} {b} over {c} {d}
{a} {{b} over {c}} {d}
(いくつかのテキストがあり、そのような表現があります)そして、両方を次のように変換したい:
{a} \frac{b}{c} {d}
これが私の最善の策です:
(goto-char (point-min))
(while (search-forward-regexp "{+?\\(.+?\\)} +over +{\\(.+?\\)}+?" nil t)
(replace-match (concat "\\\\" "frac{\\1}{\\2}") t nil))
しかし、うまくいきません。私は得る:
\frac{a} {b}{c} {d}
\frac{a} {{b}{c}} {d}
それぞれ。
問題は、私の正規表現が左側で可能な限りキャプチャすることです。できるだけキャプチャする必要がありますが。
編集:
受け入れられた答えは、より複雑なケースでは機能しません(これも必要です):
{d^{2} q} over {d t^{2} }
{{d^{2} q} over {d t^{2} }}
(入れ子のため)
パーサーの動作バージョンを次に示します (コードの興味深い部分は から始まりますwhile
)。
(defun over2frac ()
(interactive)
(let (start end
(case-fold-search nil)
lStart lEnd lStr
rStart rEnd rStr)
(if (use-region-p)
(progn (setq start (region-beginning)) ;; then
(setq end (region-end)))
(progn (setq start (line-beginning-position)) ;; else
(setq end (line-end-position))))
(save-restriction
(narrow-to-region start end)
(goto-char (point-min))
(while (search-forward-regexp "{\\(.+\\)}\s*over\s*{\\(.+?\\)}" nil t)
;; r:
(goto-char (match-beginning 2))
(backward-char 1)
(setq rStart (point))
(forward-sexp)
(setq rEnd (point))
(setq rStr (buffer-substring-no-properties rStart rEnd))
;; l:
(goto-char (match-end 1))
(forward-char)
(setq lEnd (point))
(backward-sexp)
(setq lStart (point))
(setq lStr (buffer-substring-no-properties lStart lEnd))
(delete-region lStart rEnd)
(insert "\\" "frac" lStr rStr)
))))
forward-sexp
andを使用し、backward-sexp
定義していないためsyntax-table
、適切なモード ( and など) でのみ機能しますrst-mode
が、 でtext-mode
はありませんemacs-lisp-mode
。上記の複雑な例では、次のようになります。
\frac{d^{2} q}{d t^{2} }
{\frac{d^{2} q}{d t^{2} }}
編集2:
(defun backslash-func--args-on-both-sides (Find Replace)
(goto-char (point-min))
(while (search-forward-regexp (concat "\\([^{]+\\)}\s*" Find "\s*{\\([^}]+\\)") nil t)
;; r:
(goto-char (match-beginning 2))
(backward-char 1)
(setq rStart (point))
(forward-sexp)
(setq rEnd (point))
(setq rStr (buffer-substring-no-properties rStart rEnd))
;; l:
(goto-char (match-end 1))
(forward-char)
(setq lEnd (point))
(backward-sexp)
(setq lStart (point))
(setq lStr (buffer-substring-no-properties lStart lEnd))
;; s:
(goto-char lStart)
(if (looking-back "{")
(setq lStart (1- (point))))
(goto-char rEnd)
(if (looking-at "}")
(setq rEnd (1+ (point))))
(delete-region lStart rEnd)
(insert "\\" Replace lStr rStr))
(goto-char (point-min))
(while (search-forward-regexp (concat "\\([0-9a-zA-Z_^]+\\)\s*" Find "\s*\\([0-9a-zA-Z_^]+\\)") nil t) (replace-match (concat "\\\\" Replace "{\\1}{\\2}") t nil))
)
これは両方を変換します:
{d^{2} q} over {d t^{2} }
{{d^{2} q} over {d t^{2} }}
に
\frac{d^{2} q}{d t^{2} }
ここでは使用しませんlet
。なぜなら、すべての var がすでにローカルであり、defun 自体が他の defun にあるからです。完全なコード。