我正在尝试匹配字符串,然后使用分组来创建新字符串:
(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)
为什么会这样?
答案 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 mentioned,match-string
的文档字符串会告诉您所有关于:
(match-string NUM &optional STRING)
⋮
STRING should be given if the last search was by `string-match' on STRING.
如果您还查看了string-match
的文档,则会看到它建议使用match-beginning
和match-end
来获取匹配项。这些是C中的内置函数。
(if (string-match "\\([a-z]\\)" "123 test string")
(match-beginning 1)) ;; 4
这些函数只返回匹配文本的开头或结尾位置,这也是match-string
需要原始字符串的原因。使用search-forward
或re-search-forward
时,match-beginning
和match-end
将返回缓冲区位置,因此match-string
可以轻松地从缓冲区内容中对有趣匹配进行子串。
您可能还想查看与match-string-no-properties
行为相同的match-string
,期望它返回没有文字属性的文字字符串。