【问题标题】:Emacs regular expression to remove whitespace only when the whitespace is between < > charactersEmacs 正则表达式仅在空格在 < > 字符之间时删除空格
【发布时间】:2014-07-25 00:36:24
【问题描述】:

我正在用 emacs 编辑一个文件,并希望使用 replace-regexp 命令删除 字符之间的所有空格。例如,假设我有以下内容:

<please help me> hello everyone <HI!>

申请replace-regexp后可以得到:

<please_help_me> hello everyone <HI!>

要匹配整个字符串,我们可以这样做:&lt;[a-z]^\s[a-z]*&gt; 但是,我怎么能说我只想替换空白字符?

感谢大家的帮助!

【问题讨论】:

    标签: regex emacs removing-whitespace


    【解决方案1】:

    正则表达式:

    ( )(?=[^<]+>)
    

    替换字符串:

    _
    

    DEMO

    【讨论】:

    • @phils 是否能够出于他的目的修改上述正则表达式?
    • Emacs 正则表达式没有零宽度的前瞻/后置断言(很遗憾)。
    • 虽然@phils 是对的,但我什至没有生气。这确实是一个不错的正则表达式,演示站点看起来超级有用。 AvinashRaj - 5 个月内获得 10k 积分同样令人印象深刻。 :)
    • @event_jr 我不了解 emacs。可以修改我的正则表达式吗? emacs 中的 looahead 是否允许量词出现在里面?
    • @event_jr 在 1.5 年内获得 100k.. 这太令人印象深刻了吗?
    【解决方案2】:

    这是使用elisp 的一种方法——这个例子考虑了组合整个缓冲区。我将正则表达式分成三个部分,以防原发帖人将来想对&lt;&gt; 之间的内容做一些不同的事情。如果原发帖者还不知道,Emacs 有一个很好的功能 M-x re-builder 可以测试 elisp 模式处理。

    (save-excursion
      (goto-char (point-max))
      (while (re-search-backward "\\(\<\\)\\([^>]*\\)\\(\>\\)" nil t)
        (when (looking-at "\\(\<\\)\\([^>]*\\)\\(\>\\)")
          (let* (
              (start (match-beginning 0))
              (end (match-end 0)))
            (replace-regexp "\s" "_" nil start end)))))
    

    【讨论】:

    • 修改示例:如果想将字符串&lt;tx|s*o*l*u*t*i*o*n&gt; 中的所有星号* 替换为&lt;tx|solution&gt;,则可以将[^&gt;] 替换为tx|[^&gt;],将"\s" "_" 替换为"*" "".
    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多