0

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

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

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

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

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

会给我整个字符串a.group()。它也会给我(0,10)作为答案a.span()。然而,UltiSnips 需要 1 美元才能成为 div。

我在想这个错误的方式吗?这到底是如何工作的?

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

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

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

4

1 回答 1

4

${1/(\w+).*/$1/}用 替换(\w+).*(即div class=)匹配的字符串$1

$1是(第一组)括号之间匹配的内容。括号之间的表达式是\w+,它匹配divdiv class=由于空间的关系,它与整个不匹配。

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

来自 Python:

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

输出:

('div class=', 'div')

即,$0是整个字符串匹配,div class=,并且$1div

于 2015-09-03T10:22:40.457 回答