【问题标题】:Emacs in evil-mode and regular expressions邪恶模式和正则表达式中的 Emacs
【发布时间】:2014-02-18 18:36:24
【问题描述】:

在邪恶模式下使用 Emacs,我遇到了包含 \_ 的正则表达式的问题,例如

/TAG1\_.\{-}TAG2
/TAG1\_s*TAG2

例如,第一个正则表达式在 Vim 中用于查找 TAG1TAG2 之间的任何文本块,包括空格和换行符。它将匹配例如

TAG1
text

more text TAG2

但是,在 Emacs 邪恶模式下,只要我输入 \_,我就会收到 Premature end of regular expression 错误消息。其他 搜索没有\_,如

/TAG1\n*TAG2

按预期工作,所以问题出在\_。我尝试过使用邪恶组设置,但无济于事。任何提示问题可能出在哪里?

P.S.:无论我是否使用 GUI,都会出现此问题。在 Vim 中我没有遇到任何问题

【问题讨论】:

  • 当表达式只是\_时匹配什么?
  • - 通常不需要转义。一些自制引擎使用这样的功能来表示元(例如\< 是单词边界的开头)
  • 当表达式只是/\_ 时,它会显示Incomplete input。如果使用 _ 而不转义,则将其视为任何其他字符,如预期的那样:例如/TAG1_s*TAG2 找到字符串TAG1_sTAG2(但我要找的是TAG1 TAG2!)

标签: regex emacs evil-mode


【解决方案1】:

这不是邪恶模式的问题,在emacs正则表达式中\有特殊含义。来自 emacs manual

\ 有两个功能:引用特殊字符(包括“\”),并引入额外的特殊结构。

因为'\'引用了特殊字符,所以'\$'是只匹配'$'的正则表达式,而'['是只匹配'['的正则表达式,以此类推。

您必须转义 \,因此要搜索 TAG\,您需要输入正则表达式 TAG\\

您可能会发现this 页面对于学习 elisp 正则表达式很有用。

【讨论】:

  • 感谢您的回答,伊克巴尔。但是,我不是在搜索 TAG\ 。像 Vim 中的/TAG1\_s*TAG2 这样的正则表达式试图找到序列TAG1TAG2,其中TAG1TAG2 可能被任意数量的空格或新行分隔。这是我在邪恶模式下想要的行为......并且它不是通过再次转义来实现的,即/TAG1\\_s*TAG2 不起作用。为了清楚起见,我编辑了我原来的问题。再次感谢您的链接,我正在查看它,也许我会在那里找到解决方案。
  • @summer 要在搜索替换中匹配换行符,您需要输入 C-q C-j 以便正则表达式可以是 TAG1[[:space:]^J]*TAG2(按 C-q C-j 输入 ^J)
【解决方案2】:

如果,正如您在回复 @Iqbal 时所说,您尝试匹配 TAG1,后跟零个或多个空格字符或换行符,然后是 TAG2,那么在 Emacs 中会为此编写一个正则表达式这边走: TAG1[ \n]*TAG2.

是的,您应该您自己阅读手册的正则表达式部分。不同的语言处理正则表达式的方式不同,Emacs Lisp 也不例外。

【讨论】:

  • 感谢您的回答@Drew。当然,我并不是想省去阅读 Emacs 正则表达式部分的麻烦。令人困惑的是我认为,因为我使用的是邪恶模式,所以我必须像在 Vim 中一样处理正则表达式(我是一个相当新的 Emacs 用户)。我发现情况并非如此,我感谢你和伊克巴尔为我指明了正确的方向。
  • 没问题;我明白。总的来说,Emacs 有自己的做事方式——有时是出于极好的原因,有时主要是为了“歇斯底里的葡萄干”。但是 Emacs 非常擅长的一件事是帮助您理解它。我对任何了解 Emacs 的人的第一个建议是:询问 Emacs。近 40 年来,它一直吹捧自己为“self-documenting”,这证明了解释自己至少是它认真对待的事情。它通常做得很好。网关正在学习从C-h C-h 获得的内容以及如何在两本 Emacs 手册中使用。享受吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 2017-06-18
相关资源
最近更新 更多