有没有办法在Emacs Lisp中提取正则表达式的组?
例如,如何使用正则表达式从“std1”获取“std”和“1”
^\(std\|bcp\|fyi\)\([0-9]+\)$
像JavaScript一样
/^(std|bcp|fyi)([0-9]+)$/.exec("std1")[1] //= std
/^(std|bcp|fyi)([0-9]+)$/.exec("std1")[2] //= 1
http://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp-Functions.html#Regexp-Functions 我读过这个页面但是无法理解如何实现这个目标。
答案 0 :(得分:4)
要添加到其他答案,您可能希望将整个(when (string-match ...) (do-something-with (match-string ...)))
模式记忆为成语。例如:
(let ((str "std1")
(reg (rx bos
(group (or "std" "bcp" "fyi"))
(group (+ digit))
eos)))
(when (string-match reg str)
(list :1 (match-string 1 str)
:2 (match-string 2 str))))
⇒ (:1 "std" :2 "1")
此外,来自s.el库的s-match
会将子匹配收集到一个列表中:
(require 's)
(let ((str "std1")
(reg (rx bos
(group (or "std" "bcp" "fyi"))
(group (+ digit))
eos)))
(s-match reg str))
⇒ ("std1" "std" "1")
然后你可以访问这样的元素:
(require 's)
(require 'dash)
(let ((str "std1")
(reg (rx bos
(group (or "std" "bcp" "fyi"))
(group (+ digit))
eos)))
(--when-let (s-match reg str)
(list :1 (elt it 1)
:2 (elt it 2))))
⇒ (:1 "std" :2 "1")
在所有三个片段中,如果匹配失败,则返回值为nil。
答案 1 :(得分:2)
使用string-match
和match-string
:
*** Welcome to IELM *** Type (describe-mode) for help.
ELISP> (string-match "^\\(std\\|bcp\\|fyi\\)\\([0-9]+\\)$" "std1")
0
ELISP> (match-string 1 "std1")
"std"
ELISP> (match-string 2 "std1")
"1"
请注意,您必须将原始字符串传递给match-string
- 它会将偏移量保存在“匹配数据”中,而不是原始字符串。