Emacs Lisp相当于JavaScript的RegExp #exec

时间:2013-11-23 12:58:43

标签: regex emacs elisp

有没有办法在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 我读过这个页面但是无法理解如何实现这个目标。

2 个答案:

答案 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-matchmatch-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 - 它会将偏移量保存在“匹配数据”中,而不是原始字符串。