oeasy教您玩轉(zhuǎn)vim - 52 - # 正則查找
查找細(xì)節(jié)
回憶上節(jié)課內(nèi)容??
我們上次研究了文件讀寫(xiě)
打開(kāi)是
e
,edit:e oeasy.txt
:e .
讀是
:r
,read:1,3r o2z.txt
范圍讀:4,9r !ls -lah
讀shell命令運(yùn)行結(jié)果寫(xiě)是
:w
,write:w o3z.txt
直接寫(xiě):3,8w o3z.txt
范圍寫(xiě):w o3z.txt >>
追加寫(xiě):w! o3z
強(qiáng)制寫(xiě)命令行可以進(jìn)行批量替換么???
我們先回憶一下搜索的細(xì)節(jié)
搜索文件
/正向
/oeasy
從上到下搜索oeasy
hls
讓搜索結(jié)果高亮n保持正方向
N改變?yōu)榉捶较?/p>
搜索到結(jié)尾之后可以用
wrapscan
從頭搜索
?正向
?oeasy
從下到上搜索oeasy
hls
讓搜索結(jié)果高亮n保持反方向
N改變反方向,改從正方向
搜索到開(kāi)頭之后也可以用
wrapscan
從頭搜索
使用寄存器
如果想在搜索或者命令行模式下使用寄存器中的內(nèi)容
可以這樣ctrl+r然后指定寄存器
:ctrl+r*
把剪貼板里面的內(nèi)容粘貼到
:
后面:h c_ctrl-r
查詢命令行模式下的ctrl+r

匹配模式
除了完全匹配的單詞之外
搜索也支持模式匹配
{pattern}
什么模式匹配
:h pattern

動(dòng)手練習(xí)
:r !ls -lah
/shiyanlou
修改大小寫(xiě)
然后嘗試大小寫(xiě)的匹配
大寫(xiě)小寫(xiě)
如果查找要忽略大小寫(xiě)的話
就用
ignorecase
:set ignorecase
簡(jiǎn)寫(xiě)為
:se ic
取消為
:se noic
ignorecase
可以和smartcase
智慧大小寫(xiě)配合/oeasy
忽略大小寫(xiě)/Oeasy
必須完全符合如果搜索模式里面有
大寫(xiě)字母
就完全匹配如果沒(méi)有
大寫(xiě)字母
就忽略大小寫(xiě)還可以加開(kāi)關(guān)
/oeasy\c
不區(qū)分大小寫(xiě)的oeasy
/oeasy\C
區(qū)分大小寫(xiě)的oeasy
具體可以
:h ignorecase

模式是什么意思?
字符重復(fù)*
字符數(shù)量
*
代表0到任意多個(gè)前字符+
代表1到任意多個(gè)前字符?
代表0或1個(gè)前字符/a*
可以匹配a
aa
aaa
`` 空串也可以匹配
/\(oe\)*
可以匹配oe
oeoe
oeoeoe
`` 空串也可以匹配
()括號(hào)
中的oe是一個(gè)可重復(fù)的原子\(\)
括號(hào)符前面加反斜杠轉(zhuǎn)義

字符重復(fù)+
+
對(duì)應(yīng)1
到任意多個(gè)字符/oe\+
可以匹配oe
oee
oeee
不能匹配
o

/\(oe\)\+
可以匹配oe
oeoe
字符重復(fù)=
=
對(duì)應(yīng)0或1
次重復(fù)

字符重復(fù) \{3,5}
指定次數(shù)

*
對(duì)應(yīng)\{0,}
+
對(duì)應(yīng)\{1,}
=
對(duì)應(yīng)\{0,1}
并列關(guān)系

/oeasy\|o2z
匹配oeasy
或者o2z
/oeasy\|o2z\|o3z
匹配oeasy
或者o2z
或者o3z
/\(ab\|cd\)\+
匹配abab
或者abcd
或者cdab
或者cdcd
或者ababab..
等
字符范圍
/a\|b\|c\|d
可以用
/[abcd]
來(lái)描述也可以用
/[a-d]
來(lái)描述a-d
代表從a
到d
[a-z]
代表任意小寫(xiě)字母[A-Za-z]
代表任意字母[0-9a-gz]
代表數(shù)字或a-g或z

特殊字符
特殊字符也可以放到字符范圍里

排除字符^
\[^a]
^
在中括號(hào)內(nèi)部開(kāi)頭時(shí)代表排除
a
以外的所有字符在中括號(hào)內(nèi)部開(kāi)頭時(shí)
^
的意思是排除不在中括號(hào)內(nèi)部開(kāi)頭時(shí)
表示行頭
/^dr
匹配行頭是dr
的

預(yù)設(shè)字符范圍
有一些字符范圍是很常用的
vim做些預(yù)設(shè)
比如
.
代表任意字符

能用字符預(yù)設(shè)就不用字符范圍
\d 數(shù)字
\D 非數(shù)字
\x 十六進(jìn)制數(shù)
\X 非十六進(jìn)制數(shù)
\s 空格和tab
\S 非空格和tab
\l 小寫(xiě)字母
\L 非小寫(xiě)字母
\u 大寫(xiě)字母
\U 非大寫(xiě)字母
字符預(yù)設(shè)匹配的速度很快
用了字符預(yù)設(shè)就不用[]了
/[\d\l]* 是不能用的
可以用 /(\d\l)* 代替
練習(xí)

上述三個(gè)表達(dá)式是相同的
盡量選第二種表示方法
絕對(duì)要避免第三種表示方法
因?yàn)槟翘?/p>
匹配換行
/one\ntwo
可以匹配換行s\nd
可以匹配上一行以s結(jié)尾,本行以d開(kāi)頭/one\_stwo
可以匹配換行也可以匹配空格one two
\s
是空格\_s
是空格或者換行前面加上
\_
就是給字符或上換行符\_.
匹配包括換行符的任意字符/"\_[^"]*"
被引號(hào)包裹起來(lái)的
任意多個(gè)除了引號(hào)外的包括換行符的所有字符
[^"]
除了引號(hào)外的所有字符不包括換行符\_[^"]
除了引號(hào)外的所有字符也包括換行符\_[^"]*
任意多個(gè)除了引號(hào)外的所有字符也包括換行符/"\_[^"]*"
這樣就可以匹配帶換行的字符串了
動(dòng)手試一試

貪婪匹配
默認(rèn)
*
的匹配是貪婪的找行內(nèi)最大范圍內(nèi)的匹配
注意這把連個(gè)
markdown
的加粗標(biāo)記連在一起了

\*\*.*\*\*
\*\*
代表前兩個(gè)星號(hào).
的數(shù)量是*
\*\*
代表后兩個(gè)星號(hào)
非貪婪匹配
還有一種非貪婪匹配
他是非貪婪的
只找最小范圍內(nèi)的匹配
注意他把這兩個(gè)分開(kāi)了
\*\*.\{-}\*\*
\*\*
代表前兩個(gè)星號(hào).的數(shù)量是
\{-}
\*\*
代表后兩個(gè)星號(hào).
的數(shù)量是\{-}

正則表達(dá)
行頭行尾
^
意味著行開(kāi)頭$
意味著行結(jié)尾詞頭詞尾
\<
意味著單詞開(kāi)頭\>
意味著單詞結(jié)尾/^a[a-z]*d$
a開(kāi)頭
d結(jié)尾
中間有任意多個(gè)小寫(xiě)字母
c語(yǔ)言標(biāo)識(shí)符

\h
意味著[A-Za-z_]
大小寫(xiě)字母和下劃線
\w
意味著[0-9A-Za-z_]
大小寫(xiě)字母和下劃線和數(shù)字
/\<\h\w*\>
以字母或下劃線開(kāi)頭
后跟字母下劃線或數(shù)字
這是c語(yǔ)言標(biāo)識(shí)符的語(yǔ)法規(guī)則
不以什么為開(kāi)頭
/\(o\)\@<!easy
aeasy
中的easy
可以匹配beasy
中的easy
也可以匹配easy
還可以匹配就是不匹配
oeasy
中的easy
但是匹配
oeasy
中的easy
加上詞頭詞尾
/.<\(o\)\@<!easy\>
aeasy
、beasy
都可以匹配easy
也可以匹配就是不匹配
oeasy
不以什么為結(jié)尾

oea\(sy\)\@!
oeasx
中的oea
可以匹配oeasz
中的oea
也可以匹配oea
也都可以匹配就連
oeas
中的oea
也都可以匹配就是不匹配
oeasy
中的oea
加上詞頭詞尾
/oea\(sy\)\@!..\>
oeasx
匹配oeasz
匹配oeasy
不匹配
總結(jié)
我們溫習(xí)了關(guān)于搜索的相關(guān)內(nèi)容
是否忽略大寫(xiě)小寫(xiě)
是否從頭開(kāi)始查找
是否高亮顯示
/正向,?反向
n保持方向,N改變方向
可以設(shè)置
還有一些正則表達(dá)式的使用方法
行頭行尾
^$
詞頭詞尾
\<\>
字符列表
[a-z]
、[A-Za-z_]
包含回車(chē)
one\_stwo
數(shù)量
數(shù)量
*
、?
、=
具體數(shù)量
\{1,3}
非貪婪
\{-}
不以什么為開(kāi)頭結(jié)尾
不以什么為開(kāi)頭
\@<!
不以什么為結(jié)尾
\@!
查找出來(lái)怎么替換呢???
下次再說(shuō) *
[Github地址] (https://github.com/overmind1980/oeasyvim)
[Gitee地址] (https://gitee.com/overmind1980/oeasyvim)
[藍(lán)橋?qū)嶒?yàn)樓 邀請(qǐng)碼FJWYIMGB] (https://www.lanqiao.cn/courses/2840)