Vim:正则表达式匹配尖括号内的单词?
Vim: regex to match words inside angle brackets?
我想匹配尖括号内的单词(html 标签):
<MatchedWord></MartchedWord>
这是我目前拥有的:
/\v\<\w+\>
问题是它也匹配 <>
和 /
.
如何做到只匹配单词?
您不需要转义尖括号(方括号是 []),因为它们不是特殊字符。您可以使用捕获组
<\/?(.+)>
您可以通过 Vim 的特殊 \zs
(匹配开始)和 \ze
(匹配结束)原子在文本之前和之后断言匹配,而无需将其包含在匹配中:
/<\/\?\zs\w\+\ze\/\?>
我在两边都包含了一个可选的 (\?
) 斜杠(例如 </this>
和 <this/>
。还要注意 \w\+
不是完全正确的XML 或 HTML 标签的表达式(但它可以是一个足够好的近似值,具体取决于您的数据)。
备选
对于大多数其他正则表达式引擎,您需要使用 lookbehind 和 lookahead 来实现这一点。 Vim也有那些(\@<=
和\@=
),但是语法比较笨拙,匹配性能可能更差。
在非 vim 环境中,这是通过使用积极的后视和前视实现的:
/(?<=<).*?(?=>)/
这与以下内容匹配:
<test> // test
</content> // /content
<div id="box"> // div id="box"
<div id="lt>"> // div id="lt
正如您在最后一个示例中看到的那样,它并不完美,但是您在 html 上使用了正则表达式,所以 you get what you pay for
我想匹配尖括号内的单词(html 标签):
<MatchedWord></MartchedWord>
这是我目前拥有的:
/\v\<\w+\>
问题是它也匹配 <>
和 /
.
如何做到只匹配单词?
您不需要转义尖括号(方括号是 []),因为它们不是特殊字符。您可以使用捕获组
<\/?(.+)>
您可以通过 Vim 的特殊 \zs
(匹配开始)和 \ze
(匹配结束)原子在文本之前和之后断言匹配,而无需将其包含在匹配中:
/<\/\?\zs\w\+\ze\/\?>
我在两边都包含了一个可选的 (\?
) 斜杠(例如 </this>
和 <this/>
。还要注意 \w\+
不是完全正确的XML 或 HTML 标签的表达式(但它可以是一个足够好的近似值,具体取决于您的数据)。
备选
对于大多数其他正则表达式引擎,您需要使用 lookbehind 和 lookahead 来实现这一点。 Vim也有那些(\@<=
和\@=
),但是语法比较笨拙,匹配性能可能更差。
在非 vim 环境中,这是通过使用积极的后视和前视实现的:
/(?<=<).*?(?=>)/
这与以下内容匹配:
<test> // test
</content> // /content
<div id="box"> // div id="box"
<div id="lt>"> // div id="lt
正如您在最后一个示例中看到的那样,它并不完美,但是您在 html 上使用了正则表达式,所以 you get what you pay for