如何用Ruby实现Vim中正则捕获组的星号包裹替换效果?
使用Ruby完成指定的正则替换操作
原始待处理文本:
Françoise lui apportait un jour <span class="T6">Aladin ou la </span><span class="T6">Lampe Merveilleuse</span>, un autre <span class="T6">Ali-Baba</span>, le <span class="T6">Dormeur éveillé</span> ou <span class="T6">Sinbad le Marin embarquant à Bassora avec toutes ses richesses</span>. J’aurais bien voulu les revoir....
在Vim中可通过以下命令完成替换:
:.s;<span class="T6">\([^<]*\)</span>;**\1**;g
替换后得到的目标文本:
Françoise lui apportait un jour **Aladin ou la ****Lampe Merveilleuse**, un autre **Ali-Baba**, le **Dormeur éveillé** ou **Sinbad le Marin embarquant à Bassora avec toutes ses richesses**. J’aurais bien voulu les revoir....
Ruby实现方案
Ruby的字符串gsub方法可以实现全局正则替换,逻辑和Vim的替换命令完全匹配:
# 定义原始文本 original_text = 'Françoise lui apportait un jour <span class="T6">Aladin ou la </span><span class="T6">Lampe Merveilleuse</span>, un autre <span class="T6">Ali-Baba</span>, le <span class="T6">Dormeur éveillé</span> ou <span class="T6">Sinbad le Marin embarquant à Bassora avec toutes ses richesses</span>. J’aurais bien voulu les revoir....' # 执行全局正则替换 result_text = original_text.gsub(%r{<span class="T6">([^<]*)</span>}, '**\1**') # 输出结果 puts result_text
代码说明
gsub方法对应Vim替换命令中的g标志,会替换所有匹配项- 正则表达式
%r{<span class="T6">([^<]*)</span>}和Vim中的正则逻辑一致:捕获<span class="T6">与</span>之间不包含<的内容 - 替换字符串
'**\1**'用**包裹捕获到的分组内容(\1对应正则中的第一个捕获组)
运行这段代码后,输出结果和Vim替换后的效果完全一致。
内容的提问来源于stack exchange,提问作者zabouti
相关产品推荐
相关产品推荐

