【问题标题】:Vim: regex to match words inside angle brackets?Vim:正则表达式匹配尖括号内的单词?
【发布时间】:2015-04-20 22:15:15
【问题描述】:

我想匹配尖括号内的单词(html标签):

<MatchedWord></MartchedWord>

这是我目前所拥有的:

/\v\<\w+\>

问题是它也匹配&lt;&gt;/

如何做到只匹配单词?

【问题讨论】:

  • 这些是尖括号,不是方括号!这些是方括号:[]
  • @DevonParsons 好的,已修复。

标签: regex vim


【解决方案1】:

在非 vim 环境中,这是使用正向后向和前瞻来实现的:

/(?<=<).*?(?=>)/

这符合以下内容:

<test>         // test
</content>     // /content
<div id="box"> // div id="box"
<div id="lt>"> // div id="lt

正如你在最后一个例子中看到的那样,它并不完美,但你在 html 上使用了正则表达式,所以you get what you pay for

See the regex in action

【讨论】:

  • 显然 OP 是专门针对 VIM 的,这个答案是为未来的读者提供的。
  • Vim 也有正向的lookbehind 和lookahead:\(&lt;\)\@&lt;=.*\(&gt;\)\@=
  • @Ben 我知道 Vim 有前瞻和后瞻功能,这个答案与 Vim 无关
【解决方案2】:

您可以通过 Vim 的特殊 \zs(匹配开始)和 \ze(匹配结束)原子断言文本之前和之后的匹配,而无需将其包含在匹配中:

/<\/\?\zs\w\+\ze\/\?>

我在两边都包含了一个可选的 (\?) 斜杠(例如 &lt;/this&gt;&lt;this/&gt;。另请注意,\w\+ 不是 XML 或 HTML 标记的完全正确的表达式(但它可以是一个足够好的近似值,具体取决于您的数据)。

另类

对于大多数其他正则表达式引擎,您需要使用 lookbehindlookahead 来实现这一点。 Vim 也有这些(\@&lt;=\@=),但语法更笨拙,匹配性能可能更差。

【讨论】:

  • 这似乎匹配所有&lt;
  • 我没有使用 Vim 进行 RegEx,如何处理捕获组。我的解决方案是使用捕获组最简单的方法
  • @mgamba: 如果你输入这个,/ 需要被转义;我已经添加了!
  • @Jeanno:捕获组用于替换(使用:substitute);他们对纯粹的搜索没有帮助。
  • @IngoKarkat 是的,我的错误
【解决方案3】:

您不需要转义尖括号(方括号是 []),因为它们不是特殊字符。您可以使用捕获组

<\/?(.+)>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 2011-07-18
    • 2014-10-22
    • 2010-09-22
    相关资源
    最近更新 更多