这个正则表达式在 Vim 的 UltiSnips 中究竟是如何工作的?

How exactly is this regex working in UltiSnips for Vim?

我刚开始使用 UltiSnips Vim,现在我正在尝试转换。我无法理解截屏视频中给出的第一个示例。该转换用于 HTML 标记,以删除除结束标记的标记名称之外的所有内容。片段的相关部分如下

<>
</${1/(\w+).*//}>

无论我怎么看,我从这个正则表达式中得到的是它在说“匹配一个完整的单词,然后匹配后面的所有字符。我用 RegExr 试了一下,我的假设是正确的. 如果给定一个文本 "div class=" 上面的正则表达式匹配整个文本。

我也在 python 上试过了(因为 Ultisnips 使用 python re 模块)。

a = re.search('(\w+).*//)

会给我 a.group() 中的整个字符串。它还会给我 (0,10) 作为 a.span() 的答案。然而,UltiSnips 将 1 美元计算为 div。

我是不是想错了?这究竟是如何工作的?

在 regex101.com 上尝试正则表达式后,我得到 div 作为匹配组 #1。如果我使用 (\w+) 而不是 (\w+).*,我也会将 div 作为唯一的匹配项。但是当我尝试使用

</${1/(\w+)//}>

作为转换语法,我输入的整个字符串 (div class=) 都包含在内。基本上它匹配整个字符串。

${1/(\w+).*//}(\w+).*匹配的字符串(即div class=)替换为</code>.</p> <p><code> 是(第一组)括号之间的匹配项。括号内的表达式为\w+,匹配div。由于 space.

,它与整个 div class= 不匹配

因此 ${1/(\w+).*//}div class= 替换为 div。这正是它应该发生的。

来自 Python:

import re
a = re.search('(\w+).*', 'div class=')
print a.group(0, 1)

输出:

('div class=', 'div')

[=23=]是匹配的整个字符串,div class=</code>是<code>div.