【发布时间】:2015-05-06 21:59:39
【问题描述】:
我似乎很难找到在 vim 中替换 [A-Za-z0-9] 等范围的资源。
这是我的例子...
搜索:
<h4>Text in Markup</h4>
替换后:
<h4><%= _t('Text in Markup') %></h4>
我正在尝试在 Vim 7.4 中执行以下操作
:s/>([a-zA-Z\s]+)</><%= _t('$1') %></g
关于如何实现这一点的任何建议?
【问题讨论】:
我似乎很难找到在 vim 中替换 [A-Za-z0-9] 等范围的资源。
这是我的例子...
搜索:
<h4>Text in Markup</h4>
替换后:
<h4><%= _t('Text in Markup') %></h4>
我正在尝试在 Vim 7.4 中执行以下操作
:s/>([a-zA-Z\s]+)</><%= _t('$1') %></g
关于如何实现这一点的任何建议?
【问题讨论】:
是的,试试这个:
:s/\m<\(\w\+\)[^>]*>\zs[^<]\+\ze<\/\1>/<%= _t('&') %>/g
解密:
s/.../.../g - 全部替换当前行\m - 打开“神奇”正则表达式语法\(...\) - 分组\w\+ - 一个或多个单词字符[^>]* - 零个或多个 not-> 字符(即跳过属性)\zs...\ze - 仅替换这些点之间匹配的内容[^<]\+ - 一个或多个 not-< 字符<\/\1> - 结束标签与开始标签匹配& - \zs 和 \ze 之间匹配的任何内容。【讨论】:
一个非常简单的解决方案:
:s/>\([^<]\+\)/><%= _t('\1') %></g
但请注意,如果您有包含 > 或 < 的内容(属性、cmets),它将不起作用。
【讨论】: