【发布时间】:2015-04-20 22:15:15
【问题描述】:
我想匹配尖括号内的单词(html标签):
<MatchedWord></MartchedWord>
这是我目前所拥有的:
/\v\<\w+\>
问题是它也匹配<> 和/。
如何做到只匹配单词?
【问题讨论】:
-
这些是尖括号,不是方括号!这些是方括号:
[] -
@DevonParsons 好的,已修复。
我想匹配尖括号内的单词(html标签):
<MatchedWord></MartchedWord>
这是我目前所拥有的:
/\v\<\w+\>
问题是它也匹配<> 和/。
如何做到只匹配单词?
【问题讨论】:
[]
在非 vim 环境中,这是使用正向后向和前瞻来实现的:
/(?<=<).*?(?=>)/
这符合以下内容:
<test> // test
</content> // /content
<div id="box"> // div id="box"
<div id="lt>"> // div id="lt
正如你在最后一个例子中看到的那样,它并不完美,但你在 html 上使用了正则表达式,所以you get what you pay for
【讨论】:
\(<\)\@<=.*\(>\)\@=
您可以通过 Vim 的特殊 \zs(匹配开始)和 \ze(匹配结束)原子断言文本之前和之后的匹配,而无需将其包含在匹配中:
/<\/\?\zs\w\+\ze\/\?>
我在两边都包含了一个可选的 (\?) 斜杠(例如 </this> 和 <this/>。另请注意,\w\+ 不是 XML 或 HTML 标记的完全正确的表达式(但它可以是一个足够好的近似值,具体取决于您的数据)。
对于大多数其他正则表达式引擎,您需要使用 lookbehind 和 lookahead 来实现这一点。 Vim 也有这些(\@<= 和 \@=),但语法更笨拙,匹配性能可能更差。
【讨论】:
<的
/ 需要被转义;我已经添加了!
:substitute);他们对纯粹的搜索没有帮助。
您不需要转义尖括号(方括号是 []),因为它们不是特殊字符。您可以使用捕获组
<\/?(.+)>
【讨论】: