【问题标题】:Regexps in Elisp to include newlinesElisp 中的正则表达式包含换行符
【发布时间】:2008-11-26 12:48:48
【问题描述】:

我正在尝试在 emacs(python 模式)中为 Python 文档字符串添加特殊标记。

目前我可以提取一行:

(font-lock-add-keywords
 'python-mode
 '(("\\(\"\\{3\\}\\.+\"\\{3\\}\\)"
    1 font-lock-doc-face prepend)))

现在可以了:

"""Foo"""

但只要有一个换行符,例如:

"""
Foo

"""

它不再起作用了。这是合乎逻辑的,因为. 不包括换行符 (\n)。 我应该使用字符类吗?

如何更正此正则表达式以包含""" """ 之间的所有内容?

提前致谢!

【问题讨论】:

    标签: regex emacs elisp


    【解决方案1】:
    "\\(\"\\{3\\}\\(.*\n?\\)*?\"\\{3\\}\\)"
    

    “*?”构造是“*”的非贪婪版本。

    【讨论】:

    • 由于某些奇怪的原因,我的 emacs 在使用此正则表达式时挂起。挂在Loading vc...done
    【解决方案2】:

    emacs 正则表达式中的换行符由 C-q C-j 输入,所以只需粘贴一个包含 .和 C-q C-j 进入你的正则表达式。当我使用 regexp-tool 构建它们时,我的没有完全引用为你的,但我希望这些变化是显而易见的。

    \("\{3\}\(.\|C-qC-j\)+"\{3\}\)

    对不起,我无法更好地格式化它,stackoverflow 不同意我的观点。

    它可能会在 emacs 中显示为换行符。

    【讨论】:

    • 这是不正确的。对于 elisp 中的字符串文字,您可以使用 \n。当输入正则表达式交互时,例如使用正则表达式 isearch,只有这样\n 才不是换行符,而是需要C-q C-j
    【解决方案3】:

    这成功了一半:

    (font-lock-add-keywords
         'python-mode
          '(("\\(\"\\{3\\}\\(.\\|\n\\)*?\"\\{3\\}\\)" 
             1 font-lock-warning-face prepend)))
    

    但是当添加 RET 时,标记消失了。

    建议的正则表达式 "\\(\"\\{3\\}\\(.*\n?\\)*?\"\\{3\\}\\)" 使我的 emacs 在打开 .py 文件时挂起。

    也许是时候访问 emacs 邮件列表了..

    【讨论】:

    • @JoelBorggrén-Franck 错了,Lisp 字符串中的\n 代表换行符。
    【解决方案4】:

    最好和最简单的方法是这个:

    font-lock-add-keywords
     'python-mode
     '(("\\(\"\\{3\\}\\[^|]*?\"\\{3\\}\\)"
        1 font-lock-doc-face prepend)))
    

    您可以使用绝对不在“”和“”之间的任何字符来代替|

    【讨论】:

    • 但不能保证字符串不包含所有可能的 ASCII 字符。这就是分隔符由三个相同字符组成的原因。我想你可以用\\([^\"]+\\(\"[^\"]\\|\"\"[^\"]\\)\\?\\)*之类的东西来解决它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    相关资源
    最近更新 更多