如何用Vim :s命令正则删除单引号内第二个逗号后的内容
Vim 替换命令及原理说明
正确替换命令
:%s/'\([^,]*\),[^']*'/'\1'/g
正则原理拆解
:%s/:全局替换模式,作用于文件所有行':精准匹配字符串里的左单引号,锁定要处理的内容范围起始点\([^,]*\):捕获组,[^,]表示匹配非逗号的任意字符,*表示匹配0次或多次,整体就是把单引号内第一个逗号之前的所有内容(也就是要保留的院校名称)捕获下来,后续用\1引用这个捕获到的内容,:匹配单引号内需要删除的起始逗号[^']*:匹配逗号之后到右单引号前的所有非单引号字符,也就是要剔除的地址后缀部分':匹配右单引号,锁定处理范围的结束点/'\1'/:替换成左单引号 + 捕获到的院校名称 + 右单引号,实现只保留目标内容g:每行内全局匹配(虽然本例每行只有一个目标组,但加上后能兼容一行多组的情况)
你之前尝试的命令问题在于没有精准限定匹配边界:.*是贪婪匹配,会从第一个逗号一直匹配到行尾的单引号,导致误删过多内容;而上面的正则用[^,]和[^']限定了匹配范围,避免了贪婪匹配的问题。
内容的提问来源于stack exchange,提问作者prateek khanal
相关产品推荐
相关产品推荐

