这个正则表达式在 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
.
我刚开始使用 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
.