gpt4 book ai didi

regex - emacs 语法突出显示数字不是单词的一部分(使用正则表达式?)

转载 作者:行者123 更新时间:2023-12-04 22:33:16 27 4
gpt4 key购买 nike

我最近搬到了 emacs,我习惯于/喜欢突出显示数字。我从 here 获得的快速黑客将以下内容放入我的 .emacs :

(add-hook 'after-change-major-mode-hook
'(lambda () (font-lock-add-keywords
nil
'(("\\([0-9]+\\)"
1 font-lock-warning-face prepend)))))

这提供了一个良好的开端,即突出显示任何数字。但是,我是一个完整的正则表达式初学者,理想情况下会喜欢以下行为:
  • 如果小数点是浮点数的一部分,也要突出显示小数点,例如12.34
  • 如果是单词的下一个/一部分,不要突出显示数字的任何部分。例如在这些情况下: foo11 ba11r 11spam,不应突出显示“1”中的任何一个
  • 允许两个整数内的 'e' 以允许科学记数法(不需要,奖励积分)

  • 不幸的是,这看起来很像我不愿意发布的“为我做这个”问题,但到目前为止我自己没有取得任何体面的进展。

    就我所知,发现 [^a-zA-Z][0-9]+[^a-zA-Z] 可以匹配任何一侧的字母(例如等号),但这只是在突出显示中包含相邻的符号。我不知道如何告诉它“只有在两边都没有字母的情况下才突出显示数字”。

    当然,我无法想象正则表达式是复杂语法突出显示的方法,因此也欢迎在 emacs 想法中突出显示任何好的数字,

    非常感谢任何帮助。 (如果它有任何区别,这是在 Python 编码时使用的。)

    最佳答案

    首先转到您的临时缓冲区并输入一些测试文本。在那里放一些数字,一些包含数字的标识符,一些缺少部分的数字(如 .e12 )等。这些将是我们的测试用例,让我们可以快速进行实验。现在运行 M-x re-builder 进入正则表达式构建器模式,这将允许您针对当前缓冲区的文本尝试任何正则表达式以查看它匹配的内容。这是一个非常方便的模式;你将能够一直使用它。请注意,因为 Emacs lisp 要求您将正则表达式放入字符串中,所以您必须将所有反斜杠加倍。你已经做对了,但我不会在这里加倍。

    因此,将匹配限制为不属于标识符的数字非常容易。\b 将匹配单词边界,因此在正则表达式的任一端放置一个将使其匹配整个单词

    您可以通过向开始的字符类添加句点来匹配浮点数,使其成为 [0-9.] 。不幸的是,这可以完全匹配一个时期;我们真正想要的是 [0-9]*\.?[0-9]+ ,它将匹配 0 个或多个数字,然后是一个可选的句点,然后是一个或多个数字。

    前导符号可以与 [-+]? 匹配,这样我们就会得到负数。

    为了匹配指数,我们需要一个可选的组: \(...\)? ,因为我们只使用它来突出显示,实际上不需要分离组的内容,我们可以做 \(?:...\) ,这将节省正则表达式匹配器的时间.在组内,我们需要匹配一个“e”( [eE] )、一个可选符号( [-+]? )和一个或多个数字( [0-9]+ )。

    将它们放在一起: [-+]?\b[0-9]*\.?[0-9]+\(?:[eE][-+]?[0-9]+\)?\b 。请注意,我在第一个单词边界之前放置了可选符号,因为“+”和“-”字符创建了一个单词边界。

    关于regex - emacs 语法突出显示数字不是单词的一部分(使用正则表达式?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14980008/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com