为了账号安全,请及时绑定邮箱和手机立即绑定

求一个vim中的正则

求一个vim中的正则

慕田峪7331174 2019-04-16 20:27:05
原始文本简化如下(好几个建表语句,有些表中有相同的字段):CREATETABLE`test1`(`field1`int,)ENGINE=InnoDBCREATETABLE`test2`(`field1`int,)ENGINE=InnoDBCREATETABLE`test3`(`field2`int,)ENGINE=InnoDBCREATETABLE`test4`(`field3`int,)ENGINE=InnoDBCREATETABLE`test5`(`field2`int,)ENGINE=InnoDB我需要把表中有field2字段的建表语句选出来,也就是把下面的文本选出来CREATETABLE`test3`(`field2`int,)ENGINE=InnoDBCREATETABLE`test5`(`field2`int,)ENGINE=InnoDB想到了一个正则CREATE\_.\{-}F_class_type\_.\{-}ENGINE,但这个显然有问题。怎样加限制条件使选出的文本中只有一个CREATE,这样选出的就是正确的了。谢谢。自己又查了查,使用否定环视就可以了。
查看完整描述

2 回答

?
达令说

TA贡献1821条经验 获得超6个赞

又查了一下正则,使用否定环视就能解决这个问题。
先贴正确的正则:\vCREATE(\_.(CREATE)@!){-}field2\_.{-}ENGINE.*
解释一下,也方便以后自己查看\v:任何元字符都不用加反斜杠\_.:包括换行符的所有字符(CREATE)@!:顺序否定环视(\_.(CREATE)@!){-}:非贪婪匹配任意字符,并且匹配出的结果中不含有CREATE字符串
使用否定环视后就能保证匹配出的结果只有一个CREATE字符串,也就是匹配结果不会有多条建表的语句
                            
查看完整回答
反对 回复 2019-04-16
?
PIPIONE

TA贡献1829条经验 获得超9个赞

另外的思路:用宏应该也可以
:vimsome.sql
/field2
qa{V}:w!>>wanted.sql
nq
99@a
前提是每个创建语句行间不能有空行,首尾要有空行,参见:h{
99@a中的99可以通过%/field2//n获取
                            
查看完整回答
反对 回复 2019-04-16
  • 2 回答
  • 0 关注
  • 337 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号