gpt4 book ai didi

regex - Emacs Lisp : can the same regexp match two different patterns with same number of groupings?

转载 作者:行者123 更新时间:2023-12-04 12:49:01 24 4
gpt4 key购买 nike

我已经开始按照 http://www.emacswiki.org/emacs/EmacsScripts 中给出的指示编写 Emacs 脚本。 ,这基本上是说你的脚本应该以:

:;exec emacs --script "$0" $@ 

现在我想定制 auto-mode-interpreter-regexp' accordingly, to make Emacs scripts automatically loaded with emacs-lisp 模式'。

原始的“auto-mode-interpreter-regexp”旨在匹配:
#! /bin/bash
#! /usr/bin/env perl

等等,所以就是这个:
"\\(?:#![   ]?\\([^     \n]*/bin/env[   ]\\)?\\([^  \n]+\\)\\)"

我尝试添加新的正则表达式作为替代:
(setq auto-mode-interpreter-regexp
(concat ;; match "#! /bin/bash", "#! /usr/bin/env perl", etc.
"\\(?:#![ ]?\\([^ \n]*/bin/env[ ]\\)?\\([^ \n]+\\)\\)"
;; or
"\\|"
;; match ":;exec emacs "
"\\(?::;[ ]?\\(exec\\)[ ]+\\([^ \n]+\\)[ ]*\\)"))

但是这个匹配整个字符串时,未能捕获其子匹配项,尤其是检测解释器所需的第二个。因此,我混合了正则表达式以同时匹配两个 header :
(setq auto-mode-interpreter-regexp
(concat ;; match "#!" or ":;"
"\\(?:#!\\|:;\\)"
;; optional spaces
"[ ]?"
;; match "/bin/bash", "/usr/bin/env" or "exec"
"\\(\\[^ \n]*/bin/env[ ]\\|exec[ ]\\)?"
;; match interpreter
"\\([^ \n]+\\)"))

我可以做得更好吗?谢谢你。

最佳答案

Emacs 中的正则表达式支持使用“显式编号组”构造来为任何子匹配分配组号。见 Elisp Manual 34.3.1.3 Backslash Constructs in Regular Expressions .

语法是 ‘(?num: ... )’ ,其中 num是选择的组号。

关于regex - Emacs Lisp : can the same regexp match two different patterns with same number of groupings?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9121522/

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