https://blog.csdn.net/cscrazybing/article/details/53781385
VIM中正则的非贪婪匹配
朋友托我做几个静态页面,由于工作的缘故,已经习惯了使用vim,于是下了个gVim(Vim的win32版本)来对付html源文件。其间有一件很麻烦的重复性工作,是将超链接去掉,如下:
https://blog.csdn.net/fengxinze/article/details/6870106
hello后面空格tab
/hello\s\{1,}
hello后面空格tab换行符
/hello\s\{1,}\nthe
hello
the
world
/hello\s\{1,}\nthe\nworld
在插入模式下,为了减少重复的击键输入,VIM 提供了若干快捷键,当你要输入某个上下文曾经输入过的字符串时,你只要输入开头若干字符,使用快捷键,VIM 将搜索上下文,找到匹配字符串,把剩下的字符补全,你就不必敲了。这样,编程序时你起多长的变量名都没关系了,:-) 而且还可以减少输入错误。我认为,插入补全是 VIM 最为突出的一项功能。
i<C-P> 向上搜索,补全一个词。例如,上文中出现过 filename 这个词,当你想再输入 filename 时,只要按 f<C-P> 即可。假如 VIM 向上搜索,找到以 f 开头的第一个匹配不是 filename,你可以继续按 <C-P> 搜索下一个匹配进行补全。当然,如果你想一次 <C-P> 就成功,你可以多输入几个字符比如 filen 再按 <C-P> 补全
i<C-N> 向下搜索,补全一个词
i<C-X><C-L> 补全一行。比如你写过一行 for (int i = 0; i < 100; i++),你想再写一模一样的一行,只要输入 for<C-X><C-L> 即可。如果补全出来的不是你想要的那一行,你可以按 <C-P> 或 <C-N> 选择上一个或下一个匹配行
i<C-X><C-F> 在文件系统中搜索,补全一个文件名
如果按 <C-P> 或 <C-N> 补全一个词,在当前文件中没有找到匹配,VIM 将搜索 #include 语句中的文件,而文件的位置将在 path 中搜索。
搜索字符串用的是正规表达式(Regular expression),其中许多字符都有特殊含义:
\ 取消后面所跟字符的特殊含义。比如
vim
vim
匹配字符串“[vim]”
[] 匹配其中之一。比如 [vim] 匹配字母“v”、“i”或者“m”,[a-zA-Z] 匹配任意字母
[^] 匹配非其中之一。比如 [^vim] 匹配除字母“v”、“i”和“m”之外的所有字符
. 匹配任意字符
* 匹配前一字符大于等于零遍。比如 vi*m 匹配“vm”、“vim”、“viim”……
\+ 匹配前一字符大于等于一遍。比如 vi\+m 匹配“vim”、“viim”、“viiim”……
\? 匹配前一字符零遍或者一遍。比如 vi\?m 匹配“vm”或者“vim”
^ 匹配行首。例如 /^hello 查找出现在行首的单词 hello
$ 匹配行末。例如 /hello$ 查找出现在行末的单词 hello
括住某段正规表达式
\数字 重复匹配前面某段括住的表达式。例如 hellohello.*\1 匹配一个开始和末尾都是“hello”,中间是任意字符串的字符串
对于替换字符串,可以用“&”代表整个搜索字符串,或者用“\数字”代表搜索字符串中的某段括住的表达式。
举一个复杂的例子,把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列写法:
:%s/abc.∗.∗xyz/xyz\1abc/g
:%s/abcabc.∗.∗xyzxyz/\3\2\1/g
其它关于正规表达式搜索替换的更详细准确的说明请看 :help pattern
例如:在文本中搜索所有包含amount大于0的以[ ] 括住的字符串的行,如 “amount[123]“, ”amount[200]“ 等:
首先按 :进入命令 模式,然后输入下面的串再回车开始查找:/amount\[[1-9]\([0-9]*\)\+\]
解释如下:
/ 表示进行串搜索, 其它字符为 正则表达式的内容
amount 表示匹配串包含amount
\[ 转义字符,表示匹配左中括号 [
[1-9] 表示匹配一位1到9之间任何数字
转义的左右括号,表示括住某段正则表达式,
\+ 转义字符+,表示前面一个字符或一个正则串重复1次或多次,所以,\([0-9]*\) 表示 任意个0-9之间的数字
\] 转义字符 ]
————————————————
版权声明:本文为CSDN博主「fengxinze」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/fengxinze/article/details/6870106
https://www.jb51.net/article/117930.htm
https://www.cnblogs.com/ifantastic/p/3826433.html
前言
正则表达式是文本处理领域中的一个强大的工具,它可以让文本处理的能力呈指数级的提升,如果一款文本编辑器不支持正则表达式,那么它就算不上是一个现代化的编辑器,这绝非虚言。
下面这篇文章主要跟大家介绍了关于Vim查找替换及正则表达式使用的相关内容,分享出来供大家参考学习,下面来一起看看吧。
简单替换表达式
:[range]s/from/to/[flags]
range:搜索范围,如果没有指定范围,则作用于但前行。
- :1,10s/from/to/ 表示在第1到第10行(包含第1,第10行)之间搜索替换;
- :10s/from/to/ 表示只在第10行搜索替换;
- :%s/from/to/ 表示在所有行中搜索替换;
- 1,$s/from/to/ 同上。
flags 有如下四个选项:
- c confirm,每次替换前询问;
- e error, 不显示错误;
- g globle,不询问,整行替换。如果不加g选项,则只替换每行的第一个匹配到的字符串;
- i ignore,忽略大小写。
这些选项可以合并使用,如cgi表示不区分大小写,整行替换,替换前询问。
正则表达式
1、元字符
元字符
元字符 | 说明 |
---|---|
. | 匹配任意字符 |
[abc] | 匹配方括号中的任意一个字符,可用-表示字符范围。如[a-z0-9]匹配小写字母和数字 |
[^abc] | 匹配除方括号中字符之外的任意字符 |
\d | 匹配阿拉伯数字,等同于[0-9] |
\D | 匹配阿拉伯数字之外的任意字符,等同于[^0-9] |
\x | 匹配十六进制数字,等同于[0-9A-Fa-f] |
\X | 匹配十六进制数字之外的任意字符,等同于[^0-9A-Fa-f] |
\l | 匹配[a-z] |
\L | 匹配[^a-z] |
\u | 匹配[A-Z] |
\U | 匹配[^A-Z] |
\w | 匹配单词字母,等同于[0-9A-Za-z_] |
\W | 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_] |
\t | 匹配<TAB>字符 |
\s | 匹配空白字符,等同于[\t] |
\S | 匹配非空白字符,等同于[^\t] |
一些普通字符需转意
元字符 | 说明 |
---|---|
\* | 匹配* 字符 |
. | 匹配. 字符 |
\/ | 匹配 / 字符 |
\ | 匹配 \ 字符 |
\[ | 匹配 [ 字符 |
\] | 匹配 ] 字符 |
表示数量的元字符
元字符 | 说明 |
---|---|
* | 匹配0-任意个 |
\+ | 匹配1-任意个 |
\? | 匹配0-1个 |
\{n,m} | 匹配n-m个 |
\{n} | 匹配n个 |
\{n,} | 匹配n-任意个 |
\{,m} | 匹配0-m个 |
表示位置的元字符
元字符 | 说明 |
---|---|
$ | 匹配行尾 |
^ | 匹配行首 |
\< | 匹配单词词首 |
\> | 匹配单词词尾 |
2、替换变量
在正则式中以\(和\)括起来的正则表达式,在后面使用的时候可以用\1、\2等变量来访问\(和\)中的内容。
例子
- 删除行尾空格::%s/\s+$//g
- 删除行首多余空格:%s/^\s*// 或者 %s/^ *//
- 删除沒有內容的空行:%s/^$// 或者 g/^$/d
- 删除包含有空格组成的空行:%s/^\s*$// 或者 g/^\s*$/d
- 删除以空格或TAB开头到结尾的空行:%s/^[ |\t]*$// 或者 g/^[ |\t]*$/d
- 把文中的所有字符串“abc……xyz”替换为“xyz……abc”可以有下列写法
1
2
|
:%s/abc\(.*\)xyz/xyz\1abc/g
:%s/\(abc\)\(.*\)\(xyz\)/\3\2\1/g
|
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
搜索单词
Vim中使用 \< 和 \> 分别表示单词的开头和结尾,例如查找单词 i 而不是字母 i ,在正常模式下,按下 / 启动搜索模式,输入 \<i\> ,敲击回车即可。
要查找当前光标覆盖的单词,敲击 * ,Vim会自动启动搜索模式,光标移动到该单词下一个现身位置。
搜索当前单词并连续修改
假定当前光标覆盖的单词为 foo,按下 * 键,Vim 会搜索并跳转到下一个 foo 的位置,按下 ciw 组合键,意思是 change inner word ,此时 foo 会被删除,在原位置输入 bar ,然后按下 Escape 键。这就完成了一次搜索并修改,接下来按 n 键继续搜索,如果还需要修改,则按下 . 键表示重复修改动作,如此反复完成连续搜索与修改。
搜索连续重复单词
有时你可能会连续重复输入同一个单词而不自知,例如以下文本:
1 hello hello 2 world world 3 thank 4 thank
搜索模式:
\(\<\w\+\>\)\_s*\1
以上搜索模式会匹配文本中的1-4行。在Vim中,使用 \( 和 \) 包括的部分视为一个原子,其中 \(\<\w\+\>\) 匹配一个单词原子,\s 匹配空格符和tab符, \_s 匹配空格符、tab符和换行符, \_s* 匹配0次或多次。
搜索A或B
使用 \| 表示或逻辑,例如 red\|green\|blue 匹配字符串(注意不是单词)red或green或blue。
如果要将匹配的对象替换成新的字符串,可以使用 :%s/搜索正则/新字符串/g,例如将所有的red或green字符串替换为purple:
:%s/red\|green/purple/g
替换所有单词red或green为单词purple:
:%s/\<\(red\|green\)\>/purple/g
Vim具有搜索模式记忆,因此以上命令也可以拆解为两步:
第一步:搜索单词red或green:
/\<\(red\|green\)\>
第二步:将搜索结果替换为purple:
:%s//purple/g
替换命令中搜索正则为空时,Vim会直接使用最后一次使用过的搜索正则作为默认表达式。
有时我们并不想替换结果,而是想要对结果做一些装点,那么可以使用 & 来引用搜索结果,例如以下示例会将文本中所有的单词red或green添加上引号:
:%s/\<\(red\|green\)\>/"&"/g
或者使用分组 \1, \2, \3 ... 来引用搜索结果:
:%s/\<\(red\|green\)\>/"\1"/g
- 搜索与替换
:substitute 命令搜索一个字符串并将其替换为新字符串,以下为一些基本使用方法。
:%s/foo/bar/g
全文搜索每个foo并替换为bar。
:s/foo/bar/g
当前行搜索每个foo并替换为bar。
:%s/foo/bar/gc
全文搜索每个foo并替换为bar,替换前需要确认。
:%s/\<foo\>/bar/gc
全文搜索每个单词foo并替换为bar,替换前需要确认。
:%s/foo/bar/gci
全文搜索每个foo并替换为bar,替换前需要确认,大小写不敏感。
:%s/foo/bar/gcI
全文搜索每个foo并替换为bar,替换前需要确认,大小写敏感。
标记g:表示全局搜索,对每一个匹配结果进行操作,缺省标记g,则只对第一个匹配结果进行操作。
标记c:表示操作前需要进行确认。
标记i:表示大小写不敏感。
标记I:表示大小写敏感。
- 搜索分组
使用 \( 和 \) 包围住表达式使其成为一个原子,并根据原子所处位置顺序使用\1,\2,……来引用相应的匹配结果。最常见的场景莫过于对调字符串位置,例如:
原文:
1. France VS Germany
命令:
:s/\(France\)\(\sVS\s\)\(Germany\)/\3\2\1
结果:
1. Germany VS France
搜索A与B
使用 \& 表示与逻辑,例如搜索同时包含了 red 和 blue 的行。进行与逻辑搜索时,Vim按照由 \& 分隔的表达式顺序逐一匹配,因此如果开启了高亮匹配结果的功能,那么你看到高亮匹配的永远都是最后一个表达式的匹配结果。
/.*red\&.*blue
反向肯定预查搜索
使用 \(expression1\)\@<=expression2 表示反向肯定预查搜索模式,其过程为首先搜索 \@<= 右侧的原子即 expression2,遇到匹配项后再检查匹配结果左侧是否满足 expression1。例如以下命令会搜索多个冗余0的数字。
原文: 1.0 1.000 1.0100 命令: \(\.\d\+\)\@<=0\+\> 结果: 匹配了1.000后两个0,1.0100后两个0。