2

ここに私が持っているものがあります:

{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-sexpandを使用し、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 にあるからです。完全なコード

4

2 に答える 2

3

次の式を使用します:http://regex101.com/r/kY8jY5

/{+([^{}]+)}\s*over\s*{([^{}]+)}+/g

式はemacsと互換性がある必要があります。

と置換する:

\frac{\1}{\2}

注:emacsを使用している\1か、使用しているかはわかりません。$1

于 2012-09-06T17:08:30.653 に答える
0

*regexp の先頭にgreedy を追加し、それを置換の最初に配置します。

(goto-char (point-min))
(while (search-forward-regexp "\\(.*\\){+?\\(.+?\\)} +over +{\\(.+?\\)}+?" nil t) 
  (replace-match (concat "\\1\\\\" "frac{\\2}{\\3}") t nil))

私はこれを生成するためにそれを得ました:

{a} \frac{b}{c} {d}
{a} {\frac{b}{c}} {d}

余分な周囲を取り除く方法があるかどうかはわかりません{}...

于 2012-09-06T17:13:09.563 に答える