[Github地址] (
查找细节
回忆上节课内容🤔
- 进行了模式匹配批量替换的的操作
-
替换单词
:%s/\<a.*d\>/oeasy/g
-
转义字符
%s/^\/\/.*$/d
-
删除空行
:g/^\s*$//d
- 还有替换还有一些什么玩法吗?🤔
markdown变html
- 要把
markdown文件中的*斜体* - 变成
html中的<em>斜体</em> -
先写框架
s///gc- 修改基本框架
s/\*.*\*//gc- 匹配模式
- 先试一下,是否有高亮匹配
- 如果没有就
:se hls
原子化
-
s/\*\(.*\)\*//gc-
给待替换部分加上括号
- 将其明确
- 将其原子化
- 给括号转义
- 看是否能匹配
-
- 仍然能够查找到
- 下面就是替换部分
-
s/\*(.*)\*/<em>\1</em>/gc\1就是括号中的原子内容- 把待替换模式放上去
-
s/\*(.*)\*/<em>\1<\/em>/gc- 将需要转义的内容转义
- 回车,替换成功!
使用参数
- 还是把html文件转化为md文件
-
我需要把
<h1>替换为- 空格- 先搜索
/<h1>,可以搜到,说明尖括号不用转义 - 再搜索
/<h1>.*</h1> - 可以匹配
- 先搜索
- 开始写
-
:%s///gc- 上框架
-
:%s/<h1>.*</h1>//gc- 基础内容
-
:%s/<h1>(.*)</h1>//gc- 加括号
-
:%s/<h1>\(.*\)<\/h1>//gc- 转义
-
:%s/<h1>\(.*\)</h1>/- \1/gc\1就是搜索中用转义括号括起来的东西
- 如果要把
<h2>替换为-怎么办? - 如何修改
:%s/<h2>\(.*\)</h2>/ - \1/g
多个参数
-
原来的列表
Joe,Johnoeasy,oyeah
-
需要的列表
John Joeoyeah oeasy
- 需要前后对调,还要去掉逗号
-
%s///gc:%s在所有的范围内
-
%s/.*,.*//gc- 中间有逗号分开
-
%s/(.*),(.*)//gc- 用括弧原子化
-
%s/([^,]*),([^,]*)//gc- 括弧里的原子中不能有逗号
-
%s/\([^,]*\),\([^,]*\)//gc- 转义
-
\([^,]*\),\([^,]*\)原来的列表([^,]*\)前面的第一个原子,内容为除了逗号之外的字符,分隔符逗号([^,]*\)前面的第二个原子,内容为除了逗号之外的字符
- 高亮显示匹配的话
-
:%s/\([^,]*\),\([^,]*\)/\2 \1/gc-
\2 \1- 把原来的两个原子前后对调
- 中间加上空格
-
- 完成对调
如果是a标签呢?
<a href="http://oeasy.org">o</a>变成[o](http://oeasy.org)-
这里面需要两个参数
- 链接网址
http://oeasy.org - 链接文本o
- 链接网址
-
尝试搜索
/<a href=.*>.*</a>可以搜素到/<a href=".*">.*</a>不可以搜素到,说明"需要转义- 给
/<a href="(.*)">(.*)</a>把括号、斜杠、引号前面加上转义字符\ /<a href=\"\(.*\)\">\(.*\)<\/a>
- 然后写批量替换
-
:%s///gc- 框架
%s/<a href=\".*\">//gc-
%s/<a href=\".*\">.*<\/a>//gc- 有高亮匹配,证明模式ok
-
%s/<a href=\"(.*)\">(.*)<\/a>//gc- 参数原子化
-
%s/<a href=\"\(.*\)\">\(.*\)<\/a>//gc- 转义
-
%s/<a href=\"\(.*\)\">\(.*\)<\/a>/[\2]\1/gc\1对应第1个字符里面匹配的东西\2对应第2个字符里面匹配的东西- 然后就可以进行批量替换了
问题
-
<a href="http://oeasy.org">o</a>asdf<a href="http://oeasy.org">o</a>- 这句话有两个超链接
- 但是替换之后
- 却变成了一个超链接
- 这怎么办?
-
贪婪匹配与非贪婪匹配
.*对应的是贪婪匹配 greedy.{-}对应的是非贪婪匹配 non-greedy- 会匹配第一个符合条件的
- 什么是贪婪匹配?
贪婪匹配
- 把
md中的**重点文字**和**重点** - 变成
html中的<strong>重点文字</strong> - 注意他把这两个分开了
-
\*\*.\{-}\*\*\*\*代表前两个星号.的数量是\{-}\*\*代表后两个星号
.的数量是\{-}
- 根据这个我们来写替换语句
:s///gc-
:s/**(.*)**//gc- 给需要转义的字符转义
-
:s/\*\*\(.*\)\*\*//gc- 思路就是
把.*变成.\{-} - 把贪婪变成非贪婪
- 思路就是
-
:s/\*\*\(.\{-}\)\*\*//gc- 把替换的元素放上
:s/\*\*(.\{-})\*\*/<strong>\1<\/strong>/gc- 尝试一下
- 根据这个,是否能解决一行中有多个
<a>元素的问题
匹配模式
:%s///g:%s/<a href=\".*\">.*<\/a>//g:%s/<a href=\"(.*)\">(.*)<\/a>//g:%s/<a href=\"\(.*\)\">\(.*\)<\/a>//g-
:%s/<a href=\"\(.\{-}\)\">\(.\{-}\)<\/a>//g- 这步就是
把.*变成.\{-}
- 这步就是
:%s/<a href=\"\(.\{-\})\">\(.\{-\}\)<\/a>/[\2]\1/g
如果是<img>标签呢
-
需要把
<img src="http://oeasy.org/o.png" title="o" /> - 先尝试匹配
/<img src=\"\(.*\)\" title=\"\(.*\)\" \/>- 也就是
/<img src="(.*)" title=(.*)">给引号、括号、斜杠都加上转义/ - 匹配成功之后开始替换
:%s/<img src=\"\(.*\)\" title=\"\(.*\)\" \/>/[!\2]\1- 如果一行有多个img怎么办?
- 还得把贪婪的变成非贪婪的
总结
-
我们学习了关于模式匹配中使用参数
- 别着急
- 先列框架
- 在一步一步填充进去皮肉
- 注意转义
- 冷静仔细
- 不断看着高亮的反馈
-
单个参数
:%s/<h2>\(.*\)</h2>/ - \1/g
-
多个参数
:%s/<img src=\"\(.*\)\" title=\"\(.*\)\" \/>/[!\2]\1
-
非贪婪匹配
:%s/<a href=\"\(.\{-\})\">\(.\{-\}\)<\/a>/[\2]\1/g
- 我们介绍一种更神奇的模式,可视化编辑模式🤔
- 下次再说 👋





浙公网安备 33010602011771号