共计 2680 个字符,预计需要花费 7 分钟才能阅读完成。
[Github 地址] (https://github.com/overmind19…)
[Gitee 地址] (https://gitee.com/overmind198…)
[蓝桥实验楼 邀请码 FJWYIMGB] (https://www.lanqiao.cn/course…)
查找细节
回顾上节课内容🤔
- 进行了模式匹配批量替换的的操作
替换单词
:%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,John
oeasy,oyeah
须要的列表
John Joe
oyeah 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
- 咱们介绍一种更神奇的模式,可视化编辑模式🤔
- 下次再说 👋