匹配正则表达式与emacs中的分组

时间:2009-06-08 14:36:19

标签: regex emacs elisp

我正在尝试匹配字符串,然后使用分组来创建新字符串:

  (let ((url (browse-url-url-at-point)))
    (if (string-match "http://domain/\\([0-9]+\\)/\\([a-z]+\\)\.\\([0-9]+\\)" url)
  (setq filename (concat (match-string 1 url) "_" (match-string 2) "." (match-string 3) ".xml"))))

当我(打印网址)时,我得到以下内容

"http://domain/1234/action.1234567"

成功比赛后,当我(打印文件名)时,我得到以下内容:

#("1234_ublish.eport s.xml" 0 5 nil 5 11 (face nxml-element-local-name-face fontified t) 11 12 nil 12 17 (face nxml-element-local-name-face fontified t) 17 18 (fontified t) 18 19 (face nxml-attribute-local-name-face fontified t) 19 23 nil)

为什么会这样?

3 个答案:

答案 0 :(得分:4)

您没有为第二个和第三个匹配字符串包含可选字符串参数。根据匹配字符串文档“如果最后一次搜索是字符串上的'string-match',则应该给出字符串。”

答案 1 :(得分:3)

我发现了问题。

事实证明(string-match)需要将原始字符串作为参数,否则它会返回包含奇怪值的奇怪列表(不确定这些是什么)。

无论如何,将代码更改为:

 (let ((url (browse-url-url-at-point)))
    (if (string-match "http://domain/\\([0-9]+\\)/\\([a-z]+\\)\.\\([0-9]+\\)" url)
  (setq filename (concat (match-string 1 url) "_" (match-string 2 url) "." (match-string 3 url) ".xml"))))

修复问题

答案 2 :(得分:2)

作为mamboking already mentionedmatch-string的文档字符串会告诉您所有关于:

的信息
(match-string NUM &optional STRING)
 ⋮
STRING should be given if the last search was by `string-match' on STRING.

如果您还查看了string-match的文档,则会看到它建议使用match-beginningmatch-end来获取匹配项。这些是C中的内置函数。

(if (string-match "\\([a-z]\\)" "123 test string")
  (match-beginning 1)) ;; 4

这些函数只返回匹配文本的开头或结尾位置,这也是match-string需要原始字符串的原因。使用search-forwardre-search-forward时,match-beginningmatch-end将返回缓冲区位置,因此match-string可以轻松地从缓冲区内容中对有趣匹配进行子串。

您可能还想查看与match-string-no-properties行为相同的match-string,期望它返回没有文字属性的文字字符串。