【问题标题】:Emacs Lisp Regular Expression Match everything until character sequenceEmacs Lisp 正则表达式匹配所有内容直到字符序列
【发布时间】:2013-12-21 00:41:50
【问题描述】:

我正在尝试在 emacs lisp 中编写一个匹配多行 cmets 的正则表达式。

例如:

{-
  Some

  Comment

  Here
-}

应该作为评论匹配。基本上,{- 和 -} 之间的任何内容。我几乎可以通过执行以下操作来做到这一点:

"\{\-[^-]*\-\}"

但是,如果评论中包含- 而不是紧跟},这将失败

所以,在这种情况下它不会正确匹配:

{-
  Some -
  Comment -
  Here -
-}

这应该是有效的。

基本上,我想匹配所有内容(包括换行符)直到序列-}

提前致谢!

【问题讨论】:

  • 看看这是否适合你:{-[[:unibyte:]]+?-}
  • 这似乎有效。谢谢!
  • 如果您将其作为解决方案提交,我将奖励给您。不然我自己加。
  • 另外考虑,这个解决方案仍然不适用于一些更复杂的 cmets。
  • 如果你还没有解决它,更新你的帖子,说明它不匹配的例子。

标签: regex emacs elisp


【解决方案1】:

这不适合你吗? {-[^-]*[^}]*-}

(你没有具体说明,所以我只是猜测你想要什么。{--}必须在行首吗?他们必须自己在行吗?必须有其他它们之间的字符?等等。例如,它应该匹配这样的一行吗?{--}?)

【讨论】:

    【解决方案2】:

    为此类情况制作了一个工具包。它带有一个解析器,beg-end.el。

    剩下的就是写一个函数,它会分别决定开始。对象的结尾。

    在伪代码中:

    (put 'MY-FORM 'beginning-op-at
               (lambda () (search-forward "-}")))
    
    (put 'MY-FORM 'end-op-at
         (lambda () (search-backward "{-")))
    

    完成后,它应该是可用的,即像这样复制和返回

    (defun MY-FORM-atpt (&optional arg)
      " "
      (interactive "p")
      (ar-th 'MY-FORM arg))
    

    在这里获取:

    https://launchpad.net/s-x-emacs-werkstatt/

    【讨论】:

    • 这是否返回正则表达式?我正在尝试将它与字体锁定突出显示一起使用,因此它必须采用正则表达式的形式。
    • @Joe 显示的示例返回匹配的字符串。 Emacs-Werkstatt 提供相关功能,提供 beg-end 位置等。当搜索由 begin 和 end 定义的跨任意行数的表单时,reg-exps 无法可靠地匹配。需要一个解析器。 MY-FORM-atpt 将调用 MY-FORM 上的解析器,读取定义。顺便说一句,实际情况会询问是否已经开始,即查看“{-” - lambda 必须仍然扩展。您还会询问它是否应该在字符串中匹配。基本上它应该可以用来对找到的任何部分进行字体化。
    猜你喜欢
    • 2017-09-02
    • 2011-09-26
    • 2011-09-15
    • 2020-03-16
    • 2014-01-10
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 2012-05-09
    相关资源
    最近更新 更多